根据不同的情况,我们可以用不同的方法调用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")] publicpartialclass DbModal : object, System.Runtime.Serialization.IExtensibleDataObject { private System.Runtime.Serialization.ExtensionDataObject extensionDataField; privatestring ArtReferenceField; privatestring ArticalLevelField; privatestring ChineseAbstractField; privatestring ChineseKeywordField; privatestring ChineseTitleField; privatestring DownLoadPathField; privatestring EnglishAbstractField; privatestring EnglishKeywordField; privatestring EnglishTitleField; privatestring FileClassField; privatestring IdField; privatestring PageNumField; privatestring PublishedDateField; privatestring SchoolField; privatestring SpecialtyField; privatestring StateField; privatestring StudentNameField; privatestring StudentNumField; privatestring StudyToField; privatestring TeacherField; privatestring UpLoadDateField; public System.Runtime.Serialization.ExtensionDataObject ExtensionData { get { returnthis.extensionDataField; } set { this.extensionDataField = value; } } [System.Runtime.Serialization.DataMemberAttribute()] publicstring ArtReference { get { returnthis.ArtReferenceField; } set { this.ArtReferenceField = value; } } [System.Runtime.Serialization.DataMemberAttribute()] publicstring ArticalLevel { get { returnthis.ArticalLevelField; } set { this.ArticalLevelField = value; } } [System.Runtime.Serialization.DataMemberAttribute()] publicstring ChineseAbstract { get { returnthis.ChineseAbstractField; } set { this.ChineseAbstractField = value; } } [System.Runtime.Serialization.DataMemberAttribute()] publicstring ChineseKeyword { get { returnthis.ChineseKeywordField; } set { this.ChineseKeywordField = value; } } [System.Runtime.Serialization.DataMemberAttribute()] publicstring ChineseTitle { get { returnthis.ChineseTitleField; } set { this.ChineseTitleField = value; } } [System.Runtime.Serialization.DataMemberAttribute()] publicstring DownLoadPath { get { returnthis.DownLoadPathField; } set { this.DownLoadPathField = value; } } [System.Runtime.Serialization.DataMemberAttribute()] publicstring EnglishAbstract { get { returnthis.EnglishAbstractField; } set { this.EnglishAbstractField = value; } } [System.Runtime.Serialization.DataMemberAttribute()] publicstring EnglishKeyword { get { returnthis.EnglishKeywordField; } set { this.EnglishKeywordField = value; } } [System.Runtime.Serialization.DataMemberAttribute()] publicstring EnglishTitle { get { returnthis.EnglishTitleField; } set { this.EnglishTitleField = value; } } [System.Runtime.Serialization.DataMemberAttribute()] publicstring FileClass { get { returnthis.FileClassField; } set { this.FileClassField = value; } } [System.Runtime.Serialization.DataMemberAttribute()] publicstring Id { get { returnthis.IdField; } set { this.IdField = value; } } [System.Runtime.Serialization.DataMemberAttribute()] publicstring PageNum { get { returnthis.PageNumField; } set { this.PageNumField = value; } } [System.Runtime.Serialization.DataMemberAttribute()] publicstring PublishedDate { get { returnthis.PublishedDateField; } set { this.PublishedDateField = value; } } [System.Runtime.Serialization.DataMemberAttribute()] publicstring School { get { returnthis.SchoolField; } set { this.SchoolField = value; } } [System.Runtime.Serialization.DataMemberAttribute()] publicstring Specialty { get { returnthis.SpecialtyField; } set { this.SpecialtyField = value; } } [System.Runtime.Serialization.DataMemberAttribute()] publicstring State { get { returnthis.StateField; } set { this.StateField = value; } } [System.Runtime.Serialization.DataMemberAttribute()] publicstring StudentName { get { returnthis.StudentNameField; } set { this.StudentNameField = value; } } [System.Runtime.Serialization.DataMemberAttribute()] publicstring StudentNum { get { returnthis.StudentNumField; } set { this.StudentNumField = value; } } [System.Runtime.Serialization.DataMemberAttribute()] publicstring StudyTo { get { returnthis.StudyToField; } set { this.StudyToField = value; } } [System.Runtime.Serialization.DataMemberAttribute()] publicstring Teacher { get { returnthis.TeacherField; } set { this.TeacherField = value; } } [System.Runtime.Serialization.DataMemberAttribute()] publicstring UpLoadDate { get { returnthis.UpLoadDateField; } set { this.UpLoadDateField = value; } } } }
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] [System.ServiceModel.ServiceContractAttribute(ConfigurationName="ISrchLib")] publicinterface 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")] publicinterface ISrchLibChannel : ISrchLib, System.ServiceModel.IClientChannel { }
[System.Diagnostics.DebuggerStepThroughAttribute()] [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] publicpartialclass 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) { returnbase.Channel.SelNoteBySql(ServiceName, InfoStr); } }
把这个代理类考到客户端程序就可以对WCF进行调用了,这里建议大家用工具生成,自己手写可能会出现错误,生成后如果做稍许的改动,都可能造成错误,影响到信道数据的传输。(但是这里说明一下:这个工具在xp下使用没问题,但是在2003下使用会有问题,不知是不是我2003统的问题) 停在这里就不动了,不知为啥。 大家这里可能会想到用代码生成代理类的方法,但是我试了几次没有成功,文件生成了但是没有内容。不知道为什么。高手指点。 有了这个代理类,工作就好做啦!通过这个代理类就可以调用WCF了。
Code privatevoid 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 publicclass ajaxService { // 添加 [WebGet] 属性以使用 HTTP GET [OperationContract] publicvoid DoWork() { return; }
[OperationContract] publicstring 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)] publicclass WCFservice { [OperationContract] [WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)] publicstring 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的方法。