1、Web 服务的位置:
因为Web Service是定义好命名空间的,所以当将Web Service更改服务器地址或拷贝到别处应用时,手工更改命名空间是不现实的。可以在使用时将Web Service的类实例化后,更改该实例的Url属性。而且不影响使用。如:BPConformance_asmxbpService = new BPConformance_asmx();
bpService.Url = "http://localhost/QuickStartv20/webservices/bpconformance.asmx";
还可以将值存储在配置文件中,而不是对 Web 服务的位置进行硬编码或在客户端代理中使用默认位置。这样,程序员或管理员可以在不更改代码的情况下更改配置文件中的位置。如:在客户端的Web.Config文件中添加:<appSettings>
<add key="WSUrl" value="http://localhost/quickstartv20/webservices/samples/RuntimeSelection/cs/Server/HelloWorldService.asmx" /></appSettings>
然后再在实例化类后更改属性URL,如:service.Url = System.Configuration.ConfigurationSettings.AppSettings["WSUrl"];
2、Web Service支持的数据类型:
基元(字符串): string
基元数组(整数) : int,bool,single,float,decimal,char
枚举(枚举) :Enum
类/结构 :Struct,Class
类/结构数组 :Class,Struct
通过这些数据类型,可以达到传值的目的,可以是字符串类型、数值类型、数值数组、枚举、自定义结构、自定义类。但不支持:ArrayList,Array,HashTable
3、共享类型
既然可以支持多种object参数,若在多个Web Service中用到相同结构的自定义object,可以在多个Web Service中共享使用。可以采用从一个 Web 服务返回的类型实例,传递给另一个 Web 服务。
共享类型方法是:将每个服务的 wsdl 和 discomap 放置在“App_WebReferences”目录中。如果您希望改用 wsdl.exe 创建自己的客户端代理,则在 TypeSharingService1 和 TypeSharingService2 之间共享类型的命令如下:
wsdl.exe /sharetypes
http://localhost/QuickstartV20/webservices/Samples/TypeSharing/cs/Server/TypeSharingService1.asmx
http://localhost/QuickstartV20/webservices/Samples/TypeSharing/cs/Server/TypeSharingService2.asmx
4、客户端是否支持解压缩
客户端实例将 EnableDecompression 属性设置为 true,则该客户端支持解压缩。若要禁用解压缩,将 EnableDecompression 设置为 false。禁用解压缩的一种可能情形是,希望以纯文本形式查看从服务器发送的响应的 SOAP 跟踪。将此属性设置为 false 通知服务器不支持解压缩。如:service.EnableDecompression = true;
5、会话状态(Session)和应用程序状态(Application)
使用 ASP.NET Web 服务可以访问由 ASP.NET 提供的基础状态管理。若要启用 ASP.NET 会话状态,需将 WebMethod.EnableSession 设置为 True。此外,还必须在客户端上将 serviceName.CookieContainer 设置为 System.Net.CookieContainer 的新实例。这样可以保存同一会话中的数据。但是若要保存整个应用程序(对所有传入的服务请求)的数据,这两个步骤都是不需要的。
如:服务器端 :[WebMethod(EnableSession=false)]
客户端:serviceName.CookieContainer = new System.Net.CookieContainer();
而要用Application记录应用程序的数据就不必声明直接用了,如:Application["HitCounter"]。
6、XML序列化:
命名空间System.Xml.Serialization的XmlSerializer类可以对对象进行序列化。实际上序列化的过程就是将对象转化为XML格式的过程,并可以进行反序列化。序列化的意义可能是通信及安全的考虑,Xml是通用的文本类型,可以跨平台识别的,且安全上可以不受防火墙影响。
7、应用XMl序列化之前,可以先验证消息
若要在服务上验证消息,使用 XmlValidatingReader。验证消息的最佳位置是在 SOAP 扩展中。这样可以完全控制 SOAP 消息的内容,并可以在执行相对来说代价较高的反序列化步骤之前拒绝不符合架构的消息。
8、基于事件的用于异步 WebMethod 调用
9、Web service服务器端的接口ServerInterface
要使用 ServerInterface 功能,可使用下面的两个方法:
(1) 使用 /serverInterface 开关(或缩写的 /si)和一个 wsdl 文件运行 wsdl.exe。输出将是一个代码文件,其中包含每个 wsdl 绑定的接口。
(2) 自己编写接口,在接口上应用 [WebServiceBindingAttribute],并在接口中的每个 Web 方法上应用 [WebMethodAttribute]。
(1) 的示例:wsdl.exe /si ServerInterfaceSample.wsdl
(2)的实现是通过在服务器端编程实现,客户端不变
如:[WebServiceBinding(Name="ReportDateTime", Namespace="Microsoft.Samples.XmlMessaging.WebServices")]
public interface IReportDateTime
{
[WebMethod]
DateTime getCurrentDateTime();
}
[WebService(Namespace="Microsoft.Samples.XmlMessaging.WebServices")]
public class ServerInterfaceService : IReportDateTime
{
public DateTime getCurrentDateTime()
{
DateTime now = DateTime.Now;
return now;
}
}
无论使用哪个选项,都需要在服务代码中实现接口。此功能的优点是将实现代码和协定代码(如接口所定义的那样)分开。如果更改 wsdl,然后重新生成接口,则不会丢失任何实现代码。若要遵循建议的设计指南,则不应将任何代码放置在更改 wsdl 协定的实现中。同样,不应使用影响运行时行为的代码来更改接口。协定和实现的详细信息应该分开。
9、客户端对 Web Service的身份验证。
对于客户端代理类的实例来说,如果将 UseDefaultCredentials 属性设置为 true,则客户端将使用默认凭据对 Web 服务进行身份验证。这样在运行客户端程序时,就会显示开机时的登陆界面,提示输入用户名、密码。
客户端:service.UseDefaultCredentials = true;
将 UseDefaultCredentials 属性设置为 true 等效于下列代码行:service.Credentials = System.Net.CredentialCache.DefaultCredentials;