学习 WCF (6)--学习调用WCF服务的各种方法

来自:http://www.cnblogs.com/gaoweipeng/archive/2009/07/26/1528263.html

根据不同的情况,我们可以用不同的方法调用WCF服务,本文简单总结了一下调用WCF的一些方法(代理类,Ajax...),分享给大家。

开发工具调用WCF

这中方法很方便也很简单,很多工作VS就帮我们完成了。相信大家也不会对这种方法陌生。这里简单提一下。打开VS,在项目中添加服务引用:

在config中自动声明了有关服务的节点信息,这样VS就创建了调用服务的代理:

ServiceReference1.Service1Client poxy = new ServiceReference1.Service1Client();
poxy.服务中相应的方法。


C#动态调用WCF

这个方法比较实用,可以通过工具或代码生成代理类Proxy.cs,来和WCF进行交互。不需要人为的手动进行服务的引用。生成代理类,这里我里用了工具:SvcUtil.exe,没有的朋友可以下载:SvcUtil.rar
使用方法很简单,只需将SvcUtil.exe随便放置一个位置(这里放在C:/新建文件夹)。在命令提示行中输入如下指令:

这里要注意的是SvcUtil.exe后面是服务的地址,会在工具所在的目录下生成代理类文件:


工具会给我们生成一个代理类文件,代码如下:

Code
//------------------------------------------------------------------------------
// <auto-generated>
//     此代码由工具生成。
//     运行库版本:2.0.50727.1433
//
//     对此文件的更改可能会导致不正确的行为,并且如果
//     重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------

namespace LtraSrchLib.DAL
{
    
using System.Runtime.Serialization;
    
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute(
"System.Runtime.Serialization""3.0.0.0")]
    [System.Runtime.Serialization.DataContractAttribute(Name
="DbModal", Namespace="http://schemas.datacontract.org/2004/07/LtraSrchLib.DAL")]
    
public partial class DbModal : object, System.Runtime.Serialization.IExtensibleDataObject
    {
        
        
private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
        
        
private string ArtReferenceField;
        
        
private string ArticalLevelField;
        
        
private string ChineseAbstractField;
        
        
private string ChineseKeywordField;
        
        
private string ChineseTitleField;
        
        
private string DownLoadPathField;
        
        
private string EnglishAbstractField;
        
        
private string EnglishKeywordField;
        
        
private string EnglishTitleField;
        
        
private string FileClassField;
        
        
private string IdField;
        
        
private string PageNumField;
        
        
private string PublishedDateField;
        
        
private string SchoolField;
        
        
private string SpecialtyField;
        
        
private string StateField;
        
        
private string StudentNameField;
        
        
private string StudentNumField;
        
        
private string StudyToField;
        
        
private string TeacherField;
        
        
private string UpLoadDateField;
        
        
public System.Runtime.Serialization.ExtensionDataObject ExtensionData
        {
            
get
            {
                
return this.extensionDataField;
            }
            
set
            {
                
this.extensionDataField = value;
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        
public string ArtReference
        {
            
get
            {
                
return this.ArtReferenceField;
            }
            
set
            {
                
this.ArtReferenceField = value;
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        
public string ArticalLevel
        {
            
get
            {
                
return this.ArticalLevelField;
            }
            
set
            {
                
this.ArticalLevelField = value;
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        
public string ChineseAbstract
        {
            
get
            {
                
return this.ChineseAbstractField;
            }
            
set
            {
                
this.ChineseAbstractField = value;
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        
public string ChineseKeyword
        {
            
get
            {
                
return this.ChineseKeywordField;
            }
            
set
            {
                
this.ChineseKeywordField = value;
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        
public string ChineseTitle
        {
            
get
            {
                
return this.ChineseTitleField;
            }
            
set
            {
                
this.ChineseTitleField = value;
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        
public string DownLoadPath
        {
            
get
            {
                
return this.DownLoadPathField;
            }
            
set
            {
                
this.DownLoadPathField = value;
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        
public string EnglishAbstract
        {
            
get
            {
                
return this.EnglishAbstractField;
            }
            
set
            {
                
this.EnglishAbstractField = value;
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        
public string EnglishKeyword
        {
            
get
            {
                
return this.EnglishKeywordField;
            }
            
set
            {
                
this.EnglishKeywordField = value;
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        
public string EnglishTitle
        {
            
get
            {
                
return this.EnglishTitleField;
            }
            
set
            {
                
this.EnglishTitleField = value;
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        
public string FileClass
        {
            
get
            {
                
return this.FileClassField;
            }
            
set
            {
                
this.FileClassField = value;
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        
public string Id
        {
            
get
            {
                
return this.IdField;
            }
            
set
            {
                
this.IdField = value;
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        
public string PageNum
        {
            
get
            {
                
return this.PageNumField;
            }
            
set
            {
                
this.PageNumField = value;
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        
public string PublishedDate
        {
            
get
            {
                
return this.PublishedDateField;
            }
            
set
            {
                
this.PublishedDateField = value;
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        
public string School
        {
            
get
            {
                
return this.SchoolField;
            }
            
set
            {
                
this.SchoolField = value;
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        
public string Specialty
        {
            
get
            {
                
return this.SpecialtyField;
            }
            
set
            {
                
this.SpecialtyField = value;
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        
public string State
        {
            
get
            {
                
return this.StateField;
            }
            
set
            {
                
this.StateField = value;
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        
public string StudentName
        {
            
get
            {
                
return this.StudentNameField;
            }
            
set
            {
                
this.StudentNameField = value;
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        
public string StudentNum
        {
            
get
            {
                
return this.StudentNumField;
            }
            
set
            {
                
this.StudentNumField = value;
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        
public string StudyTo
        {
            
get
            {
                
return this.StudyToField;
            }
            
set
            {
                
this.StudyToField = value;
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        
public string Teacher
        {
            
get
            {
                
return this.TeacherField;
            }
            
set
            {
                
this.TeacherField = value;
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        
public string UpLoadDate
        {
            
get
            {
                
return this.UpLoadDateField;
            }
            
set
            {
                
this.UpLoadDateField = value;
            }
        }
    }
}


[System.CodeDom.Compiler.GeneratedCodeAttribute(
"System.ServiceModel""3.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(ConfigurationName
="ISrchLib")]
public interface ISrchLib
{
    
    [System.ServiceModel.OperationContractAttribute(Action
="http://tempuri.org/ISrchLib/SelNoteBySql", ReplyAction="http://tempuri.org/ISrchLib/SelNoteBySqlResponse")]
    LtraSrchLib.DAL.DbModal[] SelNoteBySql(
string ServiceName, string InfoStr);
}

[System.CodeDom.Compiler.GeneratedCodeAttribute(
"System.ServiceModel""3.0.0.0")]
public interface ISrchLibChannel : ISrchLib, System.ServiceModel.IClientChannel
{
}

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute(
"System.ServiceModel""3.0.0.0")]
public partial class SrchLibClient : System.ServiceModel.ClientBase<ISrchLib>, ISrchLib
{
    
    
public SrchLibClient()
    {
    }
    
    
public SrchLibClient(string endpointConfigurationName) : 
            
base(endpointConfigurationName)
    {
    }
    
    
public SrchLibClient(string endpointConfigurationName, string remoteAddress) : 
            
base(endpointConfigurationName, remoteAddress)
    {
    }
    
    
public SrchLibClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
            
base(endpointConfigurationName, remoteAddress)
    {
    }
    
    
public SrchLibClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
            
base(binding, remoteAddress)
    {
    }
    
    
public LtraSrchLib.DAL.DbModal[] SelNoteBySql(string ServiceName, string InfoStr)
    {
        
return base.Channel.SelNoteBySql(ServiceName, InfoStr);
    }
}

把这个代理类考到客户端程序就可以对WCF进行调用了,这里建议大家用工具生成,自己手写可能会出现错误,生成后如果做稍许的改动,都可能造成错误,影响到信道数据的传输。(但是这里说明一下:这个工具在xp下使用没问题,但是在2003下使用会有问题,不知是不是我2003统的问题)
停在这里就不动了,不知为啥。
大家这里可能会想到用代码生成代理类的方法,但是我试了几次没有成功,文件生成了但是没有内容。不知道为什么。高手指点。
有了这个代理类,工作就好做啦!通过这个代理类就可以调用WCF了。

Code
private void CreateClientInstanceByProxy(Binding bind, EndpointAddress address, string a, string b)
{
     ISrchLib ws 
= new SrchLibClient(bind, address);//传入binding和服务的URI

     Repeater1.DataSource 
= ws.SelNoteBySql(a, b);//a,b是服务中方法的参数
     Repeater1.DataBind();
           
}

这样,如果多个服务的方法相同,只是address不同(分布在不同的服务器)。这样的调用是很不错的选择!
除此之外,我们可以采用通道工厂的方式生成客户端服务对象实例,但是前提还是需要上面生成的代理类的帮助。大家可以参看大牛Robin的文章(下面有链接)。

ASP.NET AJAX调用WCF

利用ASP.NET AJAX调用WCF:

我们新建网站一个工程,在其添加启用了Ajax的WCF服务。这样配置文件中会自动的为我们添加关键的节点。

服务中我只是简单的声明了一个方法:

Code
public class ajaxService
{
    
// 添加 [WebGet] 属性以使用 HTTP GET
    [OperationContract]
    
public void DoWork()
    {
        
return;
    }

    [OperationContract]
    
public string SayHello(string name)
    {
        
return "hello:"+name;
    }

    
// 在此处添加更多操作并使用 [OperationContract] 标记它们
}

在浏览器中预览我们的服务,然后在地址后加上/js。这样就可以生成用来访问WCF的js代理。

生成js代码
再来看一下前台页面中的代码:

Code
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    
<title>无标题页</title>
    
    
<script type="text/javascript">
    
function sayhello()
    {
      
var name = $get("txtname").value;
      ajaxService.SayHello(name,onSuccess,onFailed);      
    }
    
function onSuccess(res)
    {
       alert(res);
    }
    
function onFailed(res)
    {
        alert(res);
    }
    
</script>
</head>
<body>
    
<form id="form1" runat="server">
    
<div>
        
<asp:ScriptManager ID="ScriptManager1" runat="server">
            
<Scripts>
                
<asp:ScriptReference Path="~/js/ajaxwcf.js" />
            </Scripts>
        
</asp:ScriptManager>
    
</div>
    
    
<div>
    
<p>name:<input id="txtname" type="text" /></p>
    
<p><input id="Button1" type="button" value="hello"  onclick="sayhello()"/></p>
    
</div>
    
</form>
</body>
</html>

将ScriptManager中的<script>的path设定为刚生成的js文件。这样,脚本中声明的方法就可以调用WCF的方法了。运行一下:

这样就实现了ASP.NET AJAX对WCF的调用。

JS(jQuery)调用WCF

这里实现的思想和ASP.NET Ajax的有些类似,只不过有一些工作需要我们自己来完成,并且这个方法很灵活。
首先是WCF上:我们要在类和方法前进行如下的声明:

Code
[ServiceContract(Namespace = "")]
    [AspNetCompatibilityRequirements(RequirementsMode 
= AspNetCompatibilityRequirementsMode.Allowed)]
    
public class WCFservice
    {
        [OperationContract]
        [WebInvoke(RequestFormat 
= WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
        
public string SayHello(string name)
        {
            
return "hello:"+name;
        }
    }

接着就是配置文件

Code
<system.serviceModel>
    
<behaviors>
      
<endpointBehaviors>
        
<behavior name="AllenBehavior">
          
<enableWebScript />
        
</behavior>
      
</endpointBehaviors>
    
</behaviors>
    
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
    
<services>
      
<service name="jqueryWCF.WCFservice">
        
<endpoint address="" behaviorConfiguration="AllenBehavior" binding="webHttpBinding" contract="jqueryWCF.WCFservice" />
      
</service>
    
</services>
  
</system.serviceModel>

<behavior name="AllenBehavior"><enableWebScript /></behavior>
准备工作做好后就可以前台调用了:

Code
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    
<title>wcf</title>
<script language="javascript" type="text/javascript" src="jquery.js"></script>
<script language="javascript" type="text/javascript">
function sayhello(){
    
var name = $("#name").val();
    $.ajax({
        type: 
'post',
        url: 
'/WCFservice.svc/SayHello',
        contentType: 
'text/json',
        data: 
'{"name":"'+name+'"}',
        success: 
function(msg) {
        
var a = eval('('+msg+')');
        
if(String(a.d).length>0){alert(a.d);}
        
else{alert("服务器超时");}
        }
    });
    }
</script>
<style type="text/css">
#content
{height: 181px;width: 549px;}
#title
{width: 544px;}
    
</style>
</head>
<body>
    
<form id="form1" runat="server">
    
<div>
        name:
<input type="text" id="name" />
        
<br />
    
<input type="button"  value="hello" onclick="sayhello();" />
    
</div>
    
</form>
</body>
</html>

这里的一些注意事项大家可以但看dudu的文章(下面有链接)。这样,我们就可以利用jQuery调用wcf了。


小结:以上就是调用WCF的一些方法,希望对大家学习WCF有帮助。也希望大家分享其他调WCF的方法。

参考学习资料:

Robin:http://www.cnblogs.com/jillzhang/archive/2008/07/26/1252171.html
dudu:http://www.cnblogs.com/dudu/archive/2009/07/14/1523082.html
liulun:http://www.cnblogs.com/liulun/articles/1425382.html

转载于:https://www.cnblogs.com/love828/archive/2012/07/26/2610329.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/274708.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[科普文] Vue3 到底更新了什么?

Vue3 已经发布一段时间了&#xff0c;这个版本从底层实现到上层 API 设计都发生了非常大的变化&#xff0c;但具体改变了些什么呢&#xff1f;一起简单盘点下&#xff1a;一、Composition API使用传统的option配置方法写组件的时候问题&#xff0c;随着业务复杂度越来越高&…

ipados_如何设计具有最新iPadOS 14功能的出色iPad应用

ipadosWe all know that iPad Pro already has a seriously powerful computing power and that it’s possible to create meaningful stuff with Apple Pen.我们都知道iPad Pro已经具有强大的计算能力&#xff0c;并且可以使用Apple Pen创建有意义的东西。 But do we really…

67行JS代码实现队列取代数组,面试官刮目相看

大家好&#xff0c;我是若川。持续组织了8个月源码共读活动&#xff0c;感兴趣的可以 点此加我微信ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列。另外…

ux和ui_我怎么知道UI / UX是否适合我?

ux和ui重点 (Top highlight)I’m super excited to be writing this as it’s the first official issue of Visual Q’s! If you don’t already know, this will be a monthly advice column for designers. If you join the newsletter, you’ll receive this before it goe…

vs2017字体最佳选择_如何为下一个项目选择最佳字体? 一个简单的游戏

vs2017字体最佳选择“If I have the right font, half my design battle is already won!”“如果我使用正确的字体&#xff0c;那么我的设计大战已经赢了一半&#xff01;” In my first UX Design job, my AVP( Satish if you’re reading this, this one’s for you. ) onc…

浅谈初中级前端学习方法~

大家好&#xff0c;我是若川。 常有小伙伴问我如何学习前端开发。今天就简单谈下学习方法&#xff0c;方法可能主要适用于初中级前端。回想我们高中学习&#xff0c;是不是都是"以课本为主&#xff0c;其他资料为辅"。而且课堂上记笔记&#xff0c;然后通过大量练习&…

ui设计中的版式设计_设计中的版式-第3部分

ui设计中的版式设计and how not to suck at it以及如何不吸吮它 This is the 3rd and last part of the series. Here we take all our learnings from Part 1(Click to read) & Part 2(Click to read) and put to good use. Lets begin!这是本系列的第三部分也是最后一部…

听说你还在用开发者工具手动上传小程序,快来试试 miniprogram-ci 提效摸鱼

大家好&#xff0c;我是若川。持续组织了8个月源码共读活动&#xff0c;感兴趣的可以 点此加我微信ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列。另外…

ucla ai_UCLA的可持续性:用户体验案例研究

ucla aiRole: UX Researcher / UX Designer / Critical-thinker角色&#xff1a; UX研究人员/ UX设计人员/批判性思维者 Scope: 4 weeks, March — March 2020范围&#xff1a; 4周&#xff0c;2020年3月至2020年3月 What I Did: UX Research, Speculative Design, Product D…

大三的小白同学是如何拿到字节offer的,经验分享

这是来自大三邵小白同学的投稿。原文链接&#xff1a;https://juejin.cn/post/7092806181856657445很多时候我们容易羡慕别人成功了&#xff0c;却往往没有看到别人背后的努力。1前言大家好&#xff0c;我是邵小白&#xff0c;一个长沙某不知名双非的大三学生。今年三月份来到杭…

UNIBO大学博物馆网络设计—品牌重塑和数字产品设计

Brief / Redesign the Visual Identity of the University of Bologna Museum Network (SMA) and apply the new designs to a Digital Product简介/重新设计博洛尼亚大学博物馆网络(SMA)的视觉识别&#xff0c;并将新设计应用于数字产品 Period / Mar 2020 — June 2020期间/…

进来做几道 JavaScript 基础题找找自信?

大家好&#xff0c;我是若川。持续组织了8个月源码共读活动&#xff0c;感兴趣的可以 点此加我微信ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列。另外…

人物肖像速写_骄傲家庭:肖像项目

人物肖像速写2020 has been a solemn, transformative year. Pride month takes place in the context of a groundswell up-rising against racism and police brutality and in the continued isolation of COVID-19.2020年是庄严&#xff0c;变革的一年。 骄傲月的发生是在反…

答读者问:钱和成长,哪个更重要?

大家好&#xff0c;我是若川。持续组织了8个月源码共读活动&#xff0c;感兴趣的可以 点此加我微信ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列。另外…

ui设计颜色的使用_UI设计中颜色使用的10条原则

ui设计颜色的使用重点 (Top highlight)1.颜色术语 (1. Color Terminology) Color terminology forms our foundation of color knowledge. Think of color terms like hue, tint, and shade as tools that we can employ to develop unique color palettes.颜色术语构成了我们颜…

Chrome插件:网易云音乐听歌识曲

大家好&#xff0c;我是若川。持续组织了8个月源码共读活动&#xff0c;感兴趣的可以 点此加我微信ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列。另外…

如何设置ad18捕捉图标_图标设计中的像素捕捉

如何设置ad18捕捉图标More in the iconography series:• Foundations of Iconography• 7 Principles of Icon Design• 5 Ways to Create a Settings Icon• Icon Grids & Keylines Demystified• 3 Classic Icon FamiliesWe all want our designs to display sharp on a…

React Hooks 原理与最佳实践

大家好&#xff0c;我是若川。持续组织了8个月源码共读活动&#xff0c;感兴趣的可以 点此加我微信ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列。另外…

插图 引用 同一行两个插图_为什么插图是产品的重要组成部分

插图 引用 同一行两个插图“Hi, my name is Ludmila and I’m a UX/UI designer”“嗨&#xff0c;我叫Ludmila&#xff0c;我是UX / UI设计师” “Hi, Ludmila”“嗨&#xff0c;路德米拉” “Welcome”“欢迎” Not anonymously at all, I’ve been doing UX/UI design fo…

如果是你你会如何重新设计和定义维基百科(wikipedia)?

日期&#xff1a;2012-8-11 来源&#xff1a;GBin1.com 最近一家设计公司发布了一个关于如何重新定义和设计维基百科的网站&#xff0c;在这里网站里详细的刨析了如何重新设计维基百科的话&#xff0c;如何做品牌设计和网站设计&#xff0c;整个设计过程都使用非常详细的文档说…