控制.net里的web服务信息

来源:百度文库 编辑:神马文学网 时间:2024/04/26 06:08:03
控制.NET里的Web服务信息 2005.08.25  来自:Builder.com.cn
.NET Framework让Web服务的创建变得实在是很简单,尤其是在你使用Visual Studio .NET进行开发的时候。你看起来很普通的.NET代码文件里召唤Web服务精灵的咒语就只需要十一个字符:[WebMethod]。有了修饰类方法的[WebMethod]属性以及.asmx文件所参照的类,ASP.NET会在WSDL里生成一个完整的服务描述,并立即开始对客户提供服务。
但是,由于对应用程序有各自独特要求,所以大多数开发人员一般都无法停在[WebMethod]自动生成的代码处。开发人员添加的最明显的其它属性可能就是[WebService],你可以通过它提供详细的服务描述,以及,最重要的是,能够修改http://tempuri.org里的命名空间,这个网址由ASP.NET自动分配,也是你在后来从浏览器访问Web服务时会抱怨的东西。在本文中,我不会讲这些简单的内容,而会去考虑一些更加复杂的改变,你可能会需要这些改变来仔细修剪ASP.NET为你匆忙生成的WSDL和SOAP。
缺少SOAP报头
我们第一个例子要解决ASP.NET在缺省状态下不会生成SOAP报头元素的问题。如果需要用户向你传递诸如用户名和密码之类的信息,这些信息就应该同SOAP主体里出现的功能请求分开,而放在报头里。你需要告诉.NET这个报头应该是什么样的,哪些信息会包含这个报头,以及它是否是任何那些信息绝对必需的。首先要在和你的主Web服务类相同的命名空间里创建一个小类。
这个新的类将会代表报头元素,而且它必须:
继承System.Web.Services.Protocols.SoapHeader
由公共访问修改器确定其范围。
你可以把任何自己所希望的公共字段放到这个类里。你还需要在主Web服务类里创建这个报头类的公共实例变量。你可以用自己希望的名字命名这个实例变量;在Listing A里我把它叫做auth。不要包括进任何用于这个变量的实例化代码;ASP.NET很会做这件事。
在创建了能够用作SOAP报头元素的类和实例变量以后,你现在需要告诉ASP.NET哪个Web服务方法要使用报头。只需使用System.Web.Services.Protocols命名空间的[SoapHeader]属性来修饰那些你希望在SOAP信息里包含有报头的方法。注意[SoapHeader]属性的第一个特性是特殊报头类的实例变量名。赋予“方向”特性的值表明只有请求(到来信息)会使用这个报头,而且“必需的”特性也要求其使用;不包含必需报头的请求信息会导致服务器返回SOAP错误。如果现在创建这个服务并使用其.asmx文件查看示例SOAP,你会看到请求信息所包含的报头元素还有两个子元素,它们每一个都代表特殊报头类的一个公共字段。
由于已经告诉了ASP.NET会有报头,所以你可以对自己的Web方法实际地使用代码里的实例变量。
更多描述特性
在使用有点神秘的参数名超近道的时侯,你可能还想对你的客户更好一些,并把更加详细的描述特性放到[WebMethod]属性里。这让WSDL文件更大,但是,更加重要的是,SOAP包更小;这是个不错的折衷方案。
当你浏览.NET Framework文档看看有没有其他的方法操控SOAP和WSDL的时候,有几件事要记住。首先,要注意在三个不同命名空间里有一些属性会被用到:
System.Web.Services
System.Web.Services.Protocols
System.Xml.Serialization
这就意味着你可以在Web服务生命周期的不同阶段操控事件,这在寻求特定解决方案的时候会非常重要。例如,你也许会发现和SOAP相关的属性类都不能完成一些事情,但是你可以试一下XML串行化属性,看看是否能够在那一层操控从而实现你的目标。在细读这些命名空间的时候,你要尤其小心名称以“Attribute”结尾的类。每个打了方括号的属性都和这些类的其中一个相对应;这种情形不仅适用于和Web服务相关的属性,还适用于所有的修饰属性。例如,[WebMethod]修饰属性其实就是System.Web.Services.WebMethodAttribute类。你在类的文档里看到的公共特性也可以放到匹配修饰属性的圆括号里。
来一点点优雅
正如我先前所示的那样,你可以以自己希望的方式塑造WSDL和SOAP,而不需要诉诸于暴力方法,这会导致要在你的代码里使用XmlWriter类直接执行序列化。上面的例子大量地使用了带有方括号的修饰属性,这为引导ASP.NET创建这些信息提供了一种优雅的方式。有了可以自如使用的属性,你可以让代码保持自己所希望的风格,而同时以一种为Web服务量体裁衣的方式向外部世界展示公共界面。
声明:CSDN 登载此文出于传递更多信息之目的,