控制.NET里的Web服务信息

ZDNet软件频道 时间:2003-01-08 作者:BUILDER.COM |  我要评论(5)
本文关键词:
.NET Framework让Web服务的创建变得实在是很简单,尤其是在你使用Visual Studio .NET进行开发的时候。在本文中,不会讲这些简单的内容,而会去考虑一些更加复杂的改变,你可能会需要这些改变来仔细修剪ASP.NET为你匆忙生成的WSDL和SOAP。

.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;以及
  • 由公共访问修改器确定其范围。

你可以把任何自己所希望的公共字段放到这个类里。使用Listing A里的验证例子,你可以包括进UserID和Password字段。你还需要在主Web服务类里创建这个报头类的公共实例变量。你可以用自己希望的名字命名这个实例变量;在Listing A里我把它叫做auth。不要包括进任何用于这个变量的实例化代码;ASP.NET很会做这件事。

在创建了能够用作SOAP报头元素的类和实例变量以后,你现在需要告诉ASP.NET哪个Web服务方法要使用报头。如Listing A所示,只需使用System.Web.Services.Protocols命名空间的[SoapHeader]属性来修饰那些你希望在SOAP信息里包含有报头的方法。注意[SoapHeader]属性的第一个特性是特殊报头类的实例变量名,我在Listing A里将其命名为auth。赋予“方向”特性的值表明只有请求(到来信息)会使用这个报头,而且“必需的”特性也要求其使用;不包含必需报头的请求信息会导致服务器返回SOAP错误。如果现在创建这个服务并使用其.asmx文件查看示例SOAP,你会看到请求信息所包含的报头元素还有两个子元素,它们每一个都代表特殊报头类的一个公共字段。

由于已经告诉了ASP.NET会有报头,所以你可以对自己的Web方法实际地使用代码里的实例变量。Listing A通过把auth变量传递给另一个变量来确认用户的方式实现这个目的。ASP.NET会把auth变量实例化,所以你不会在Listing A里看到auth = new AuthenticationHeader()这样的实例化代码。


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134