vs2012.net WebService简单的创建、使用、验证、发布后更改引用
工作中使用到较多的webservice,学习了一段时间,在这里总结一下在vs中使用webservice的过程和理解。 一 创建(服务器端) ? 在vs中穿件webservice是比较简单的。下面记录一下步骤。 步骤1:新建一个web项目,注意不能是类库。 步骤2:在新建的web项目上,添加新项--web服务; 自动生成的代码如下: /// <summary> /// WebService1 的摘要说明 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。 // [System.Web.Script.Services.ScriptService] public class WebService1 : System.Web.Services.WebService { [WebMethod] public string HelloWorld() { return "Hello World"; } } 步骤3: ?编写webservice服务代码; 步骤4:发布一下编写好的代码,运行后的地址就是当前webservice的地址咯; Over! 二 调用(客户端) 直接上过程: 步骤1:在要添加webservice的项目上,右键引用--添加服务引用; 步骤2:注意这里有两种方式来添加webservice引用,一种是web reference(web引用),另一种叫:service reference(服务引用); 在添加的时候注意一下添加的是哪个,这个不大好描述;直接上图咯。下图表示服务引用↓(命名空间请自定义,就是代理类的命名空间): 如果点击上图的"高级"按钮,那么将会添加web引用↓(ps:根据下图的说明,web reference是net2.0版本的的引用方式,为了兼容性才保留下来;): ? ? ? ? 步骤3:添加完引用,并设置自定义的命名空间后,vs2012会使用工具自动根据URL去读取wsdl文件,然后生成代理类,你就可以用代理类实例化对象,然后接续工作咯···· Over! 三? 验证调用者身份(webservice的登录) 使用webservice的验证规则大体有这么几种:验证调用者Ip地址、利用soap头验证调用者的帐号密码、利用ssl加密验证;这里要说的是利用soap header进行验证的方法。 步骤一:在webservice服务中添加一个类(这个类作为传递soap头帐号密码的载体;继承自抽象类:System.Web.Services.Protocols.SoapHeader)。代码如下 namespace PointStoreWebService { /// <summary> /// 这个代码网上一大片,可以根据需要自己修改 /// </summary> public class MySoapHeader:System.Web.Services.Protocols.SoapHeader { /// <summary> /// 属性咯; /// Tips:不想用自动属性,有可以快捷生成属性的方法:限定下环线开头的私有成员,然后Ctrl+R+E,vs2012会自动构造出属性咯 /// </summary> private string _UserId = string.Empty; public string UserId { get { return _UserId; } set { _UserId = value; } } private string _PassWord = string.Empty; public string PassWord { get { return _PassWord; } set { _PassWord = value; } } /// <summary> /// 无参构造咯 /// </summary> public MySoapHeader() { } /// <summary> /// 有参构造构造咯 /// </summary> /// <param name="id"></param> /// <param name="pwd"></param> public MySoapHeader(string id,string pwd) { Initial(id,pwd); } /// <summary> /// 初始化咯 /// </summary> /// <param name="id"></param> /// <param name="pwd"></param> public void Initial(string id,string pwd) { UserId = id; PassWord = pwd; } /// <summary> /// 验证咯 /// </summary> /// <param name="id"></param> /// <param name="pwd"></param> /// <param name="msg"></param> /// <returns></returns> public bool IsValid(string id,string pwd,out string msg) { msg = ""; if (id == "admin" && pwd == "admin") { return true; } else { msg = "log error!"; return false; } } /// <summary> /// 重载咯 /// </summary> /// <param name="msg"></param> /// <returns></returns> public bool IsValid(out string msg) { return IsValid(_UserId,_PassWord,out msg); } } }步骤二:在webservice服务类中添加上面类型的成员; public MySoapHeader header = new MySoapHeader(); 步骤三:在需要进行验证的方法上添加属性:(这一步不要忘记,否则在调用的时候是 点 不出来MySoapHeader类的)? [SoapHeader("header")] 步骤四:在需要验证的方法中调用MySoapHeader类中的方法进行流程控制咯。。。。 步骤六:在使用代理类对象的方法的时候将?MySoapHeader类对象传递过去; ps:这里需要注意的是:根据vs2012添加webservice方式的不同,传递soap头的方法也不一样;具体如下: ①当你是web reference方式时:在实例化代理类后(假设名为:ServiceOBJ),可以使用ServiceOBJ.MySoapHeaderValue=soap头对象名; ②当你是Service reference方式时:代理类对象是无法找到MySoapHeaderValue这个属性的。在需要验证的方法上,作为参数传递soap头对象:ServiceOBJ.MethodName(soap头对象) 当这个方法本来就有参数的时候,那么这个方法就自动多了个参数,且在第0个参数的位置;
四 在软件发布后,动态的修改引用地址的配置方法 注意这里我使用的是新版本的service 引用方式; 当你添加一个service reference后,会在对应的项目下生成一个app.config文件:(如下) <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> </configSections> <system.serviceModel> <bindings> <basicHttpBinding> <binding name="PointStoreServiceSoap" /> </basicHttpBinding> </bindings> <client> <endpoint address="http://localhost:25548/PointStoreService.asmx" binding="basicHttpBinding" bindingConfiguration="PointStoreServiceSoap" contract="PointStoreService.PointStoreServiceSoap" name="PointStoreServiceSoap" /> </client> </system.serviceModel> </configuration>其中需要注意的是: ①basicHttpBinding节点下的<binding >,每天加一个service reference后,会生成一个binding节点。 ②client节点下的endpoint,每添加service reference,也会增加一个endpoint节点。 如果添加webservice引用的项目是一个类库,那么就需要在网站的web.config下添加响应的模块来供类库读取。即在web.config配置文件中添加如下部分: <system.serviceModel> <bindings> <basicHttpBinding> <binding name="2222222222111" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="6553600" maxBufferPoolSize="52428800" maxReceivedMessageSize="6553600" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true"> <readerQuotas maxDepth="320" maxStringContentLength="8192000" maxArrayLength="163840" maxBytesPerRead="40960" maxNameTableCharCount="163840" /> <security mode="None"> <transport clientCredentialType="None" proxyCredentialType="None" realm="" /> <message clientCredentialType="UserName" algorithmSuite="Default" /> </security> </binding> </basicHttpBinding> </bindings> <client> <endpoint address="http://2222222222222222222222222.asmx" binding="basicHttpBinding" bindingConfiguration="22222222221" contract="2222222222222221" name="22222222221" /> </client> </system.serviceModel>以上xml节的结构就是app.config配置文件中的相同,只是添加了一些属性进行限制(对于每个属性的含义,大家有需要可以internet 查查。)显然,binding 节点的name属性和endpoint节点是可以直接从app.config copy过来的; Over!? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |