`
wanjianfei
  • 浏览: 319208 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[WebServices] 之一:基础知识

阅读更多
1. 有关生存期的补充

正常情况下,每次调用 WebMethod,服务器都会创建一个新的 WebService 对象,即便客户端使用同一个代理对象多次调用 WebMethod。

而我们一旦调用了有缓存标记的 WebMethod,只要未超出缓存期,WebService 对象都不会被重新创建。在缓存期内调用没有缓存标记的 WebMethod,也会继续使用该 WebService 对象。有太多因素让这个缓存机制变得不那么可靠,因此我们不能奢望用缓存标记来维持特定的对象状态,况且缓存机制的设计初衷也只是为了快速输出那些比较稳定非常大的数据。

基于多用户并发调用这个环境,WebService 本身最好设计成无状态对象,我们可以使用 Session 和 Application 来保持特定的状态信息。

2. 异步调用

网上很多人在写有关 .net 2.0 的文章时,都喜欢用“优雅”这个词。的确,在 2.0 中编译器和代码生成器为我们封装了很多罗嗦的东西,诸如匿名方法、委托推断等等,当然还有这 WebService 的异步调用。我们不用再写那些个 BeginXXX、EndXXX 了,基于事件驱动的异步机制会自动为每个 WebMethod 生成一个 XXXAsync 的异步方法和 XXXCompleted 事件,我们只需调用该方法,并处理该事件即可完成异步操作,当真是优雅了不少。不要小看 2.0 的这些封装,我们编写的代码越少意味着出错的几率越小。

下面的示例中,我们使用了匿名方法来处理事件,看上去更简洁了些。

WebServices.cs
[WebService(Namespace = "http://www.rainsts.net/", Description="我的Web服务")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class WebService : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld()
{
return "Hello World!";
}
}

Client.cs
WebService ws = new WebService();
ws.HelloWorldCompleted += delegate(object sender, HelloWorldCompletedEventArgs e)
{
Console.WriteLine(e.Result);
};

ws.HelloWorldAsync("xxx");

3. 缓存

WebMethodAttribute.CacheDuration 为 WebService 提供了缓存申明机制。通过添加该标记,我们可以缓存输出结果。不过缓存机制会影响 WebService 的生存期(见上)。

WebServices.cs
[WebService(Namespace = "http://www.rainsts.net/", Description="我的Web服务")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class WebService : System.Web.Services.WebService
{
[WebMethod(CacheDuration=10)]
public DateTime TestCache()
{
return DateTime.Now;
}
}

Client.cs
WebService ws = new WebService();

for (int i = 0; i < 20; i++)
{
Console.WriteLine("{0}:{1}", i + 1, ws.TestCache());
Thread.Sleep(1000);
}

4. 保持状态

.NET WebService 是建立在 ASP.NET 基础上,在 WebService 中我们同样可以访问 Session、User、Application 等上下文对象,不过在某些使用细节上可能有所不同。

由于 WebService 客户端代理对象可能应用于 ConsoleApplication、WinForm 或 WebForm 等环境,而 Session 又必须通过 Cookie 来保存唯一的 SessionID,因此我们必须使用 CookieContainer 创建 Cookie 容器来保存 WebService 返回的 Session 信息,否则每次调用的 SessionID 都不同,自然无法使用 Session 来保存状态了。

创建容器对象后,必须将其引用赋值给代理对象的 CookieContainer 属性。在第一次调用 SessionEnabled WebMethod 后,该容器将持有 Session Cookie 信息。如果需要在多个代理对象中调用 SessionEnabled WebMethod,那么它们必须持有同一个 Cookie 容器对象。

WebServices.cs
[WebService(Namespace = "http://www.rainsts.net/", Description="我的Web服务")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class WebService : System.Web.Services.WebService
{
[WebMethod(EnableSession = true)]
public string TestSession()
{
string s = "TestSession";
object o = Session[s];
int i = o != null ? (int)o : 0;

++i;
Session[s] = i;

return Session.SessionID.ToString() + ":" + i;
}
}

Client.cs
WebService ws = new WebService();

// 创建Cookie容器,保持SessionID。否则每次调用的 SessionID 都不同。
CookieContainer cookies = new CookieContainer();
ws.CookieContainer = cookies;

for (int i = 0; i < 10; i++)
{
Console.WriteLine("{0}:{1}", i + 1, ws.TestSession());
}

至于 Application 的使用和 WebForm 中基本没有什么区别。

WebServices.cs
[WebService(Namespace = "http://www.rainsts.net/", Description="我的Web服务")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class WebService : System.Web.Services.WebService
{
[WebMethod]
public DateTime TestApplicationState()
{
object o = Application["TestApplicationState"];
if (o == null)
{
o = DateTime.Now;
Application["TestApplicationState"] = o;
}

return (DateTime)o;
}
}

Client.cs
for (int i = 0; i < 10; i++)
{
WebService ws = new WebService();
Console.WriteLine("{0}:{1}", i + 1, ws.TestApplicationState());
Thread.Sleep(1000);
}

5. SoapHeader

SoapHeader 多数情况下用来传递用户身份验证信息,当然它的作用远不止如此,有待于在实际应用中发掘。

SoapHeader 缺省情况下由客户端代理对象发送给 WebService,当然我们可以通过 WebMethodAttribute.Direction 来改变传送方向。

SoapHeader 使用步骤:

(1) 创建继承自 System.Web.WebServices.SoapHeader 的自定义 SoapHeader 类型。
(2) 在 WebService 中创建拥有 public 访问权限的自定义 SoapHeader 字段。
(3) 在需要使用 SoapHeader 的 WebMethod 上添加 SoapHeaderAttribute 访问特性。SoapHeaderAttribute 构造必须指定 memberName 参数,就是我们在第二步中申明的字段名称。
(4) 生成器会自动为客户端生成同名的自定义 SoapHeader 类型,只不过比起我们在 WebService 端创建的要复杂一些。同时还会为代理类型添加一个 soapheaderValue 属性。

在下面的演示代码,客户端将传递一个自定义 MyHeader 到 WebService。请注意,我们尽管在 WebService 中申明了 MyHeader 字段,但并没有创建对象实例,这是因为客户端传递过来的 XML 中包含了 SoapHeader 信息,基础结构会自动解析并创建对象实例,然后赋值给 my 字段。至于客户端,自然需要创建一个 MyHeader 对象实例,并赋值给 WebService.MyHeaderValue 属性。SoapHeaderAttribute.Direction 缺省就是 In,下面例子中的 "Direction = SoapHeaderDirection.In" 可以省略。

WebServices.cs
public class MyHeader : SoapHeader
{
public string Username;
public string Password;
}

[WebService(Namespace = "http://www.rainsts.net/", Description="我的Web服务")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class WebService : System.Web.Services.WebService
{
public MyHeader my;

[WebMethod]
[SoapHeader("my", Direction = SoapHeaderDirection.In)]
public void TestSoapHeadIn()
{
System.Diagnostics.Debug.Write(my.Username);
System.Diagnostics.Debug.Write(my.Password);
}
}

Client.cs
WebService ws = new WebService();

MyHeader head = new MyHeader();
head.Username = "u2";
head.Password = "p2";

ws.MyHeadValue = head;
ws.TestSoapHeadIn();

我们改写一下,将传递方向改为从 WebService 到客户端。自然我们需要调整 "Direction = SoapHeaderDirection.Out",在 WebMethod 中我们还必须创建 MyHeader 实例,因为这次我们不会接受到客户端传递的 SoapHeader 了。客户端代理对象调用 WebMethod 后就可以使用 MyHeaderValue 属性访问其内容了。

WebServices.cs
public class MyHeader : SoapHeader
{
public string Username;
public string Password;
}

[WebService(Namespace = "http://www.rainsts.net/", Description="我的Web服务")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class WebService : System.Web.Services.WebService
{
public MyHeader my;

[WebMethod]
[SoapHeader("my", Direction = SoapHeaderDirection.Out)]
public void TestSoapHeadOut()
{
my = new MyHeader();
my.Username = "u1";
my.Password = "p1";
}
}

Client.cs
WebService ws = new WebService();
ws.TestSoapHeadOut();

Console.WriteLine(ws.MyHeaderValue.Username);
Console.WriteLine(ws.MyHeaderValue.Password);

6. 异常

ASP.NET WebService 通过 Fault XML 元素来传递异常信息,客户端代理对象会生成一个 SoapException 的异常,并使用 Fault XML 信息填充其相关属性,诸如 Message 等。另外我们可以对 WebService 进行异常包装,除了传递 Exception Message 外,还可以传递一些错误状态代码,以便客户端用户做进一步处理。

WebServices.cs
[WebService(Namespace = "http://www.rainsts.net/", Description="我的Web服务")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class WebService : System.Web.Services.WebService
{
[WebMethod]
public void TestException()
{
try
{
throw new Exception("aaa...");
}
catch (Exception e)
{
throw new SoapException(e.Message, new System.Xml.XmlQualifiedName("ErrorCode01"), e);
}
}
}

Client.cs
WebService ws = new WebService();

try
{
ws.TestException();
}
catch (System.Web.Services.Protocols.SoapException e)
{
Console.WriteLine(e.Message);
Console.WriteLine(e.Code.Name);
}
分享到:
评论

相关推荐

    drupal web services

    1. **RESTful Web Services 模块**:这是 Drupal 中最常用的用于实现 RESTful API 的模块之一。通过这个模块,开发者可以轻松地定义哪些内容类型、视图或者其他资源可以通过 API 访问,并指定它们支持的请求方法...

    web services 教程

    总之,Web Services教程为初学者提供了一个全面的入门指南,涵盖了从基础知识到实际应用的各个方面,帮助读者理解和掌握这项技术,开启网络服务开发之旅。通过学习,开发者将能够利用Web Services实现应用程序的网络...

    RESTful Web Services 中文版 高清 PDF 电子书

    面向资源的架构(Resource-Oriented Architecture, ROA):ROA是REST式Web服务的设计原则之一,它要求开发者以资源为中心来设计Web服务。每一个资源都由URI唯一标识,并且可以通过HTTP协议的标准方法(如GET、POST、...

    Web Services Essentials

    《Web Services Essentials》是一本全面介绍了Web服务基础知识及核心技术的书籍。通过对XML-RPC、SOAP、WSDL和UDDI等关键技术的深入讲解,读者不仅可以了解到Web服务的基本原理,还能掌握其实现方法和应用场景。对于...

    Java调用.net webservices实例

    在Java中调用.NET Webservices,主要涉及到以下几个关键知识点: 1. **JAX-WS(Java API for XML Web Services)**:这是Java用于创建和使用Web Services的标准API。通过JAX-WS,我们可以将Java方法暴露为Web ...

    《Understanding SOA with Web Services中文版》webservice.

    - **Web服务是SOA的基础**:Web服务提供了一种标准的方式来描述、发布、定位和调用服务,是实现SOA的关键技术之一。 - **SOA框架下的Web服务**:在SOA框架中,Web服务不仅仅是一个简单的服务提供者,更是整个体系...

    SharePoint Web Service系列索引页

    SharePoint Web Services是MOSS的核心组成部分之一,它允许开发人员通过SOAP(Simple Object Access Protocol)调用来与SharePoint进行交互,实现各种定制化的需求。本篇将详细解析"SharePoint Web Service系列索引...

    Django restful web services the easiest way to build python

    其中,Django是最受欢迎的Web开发框架之一,它支持快速且高效地构建高质量Web应用程序和服务。 #### 三、RESTful Web服务简介 REST(Representational State Transfer)是一种架构风格,其核心理念是通过HTTP协议...

    Web Services开发

    随着互联网技术的不断发展,Web服务(Web Services)已经成为构建分布式应用的关键技术之一。它允许不同平台上的应用程序通过HTTP协议进行通信,并且通常使用XML作为数据交换格式。本文将深入探讨由Sun Microsystems...

    webservices学习之xfire

    在Web服务领域,XFire是一个历史悠久但至关重要的工具,它为Java开发者提供了一种实现Web服务(Web Services)的高效框架。XFire,全称为XFire Java Web Services,是Apache CXF项目的前身,它在早期为构建基于SOAP...

    IBM WebSphere Application Server V7.0 Web Services Guide

    ### IBM WebSphere Application Server V7.0 Web Services Guide 关键知识点概述 #### 一、引言与背景 在《IBM WebSphere Application Server V7.0 Web Services Guide》中,本书全面介绍了 WebSphere 应用服务器 ...

    Programming Web Services with SOAP

    ### Web 服务编程基础:利用 SOAP 进行开发 #### Web 服务简介 Web 服务是一种基于网络的应用程序...通过学习这些基础知识,开发者可以掌握如何使用 SOAP 创建高效且安全的 Web 服务,从而满足各种企业级应用的需求。

    校园之星LYF webservices7.rar

    【校园之星LYF Webservices7】是一个针对校园信息化服务的软件系统,主要涉及Web服务技术,可能包含一系列用于提供校园生活便捷性的API接口或Web应用程序。从标题和描述来看,我们可以推测这是一个专为学生、教师...

    Soa And Web services

    ESB是实现SOA的重要组成部分之一,它提供了基础设施级别的支持,帮助构建一个灵活、可靠的服务导向架构。 #### 结论 服务导向架构与Web服务是现代信息技术领域中非常重要的概念,它们不仅帮助企业实现了更加高效的...

    SOA Using Java Web Services

    Java Web 服务技术是实现SOA的重要手段之一。它基于Java平台,利用XML、SOAP等协议来定义和实现服务接口。Java Web 服务可以跨平台、跨语言地提供服务,并且支持多种传输协议,如HTTP、SMTP等,这使得Java Web 服务...

    programming web services with xml rpc

    - **安装PythonWare XML-RPC**:介绍了如何安装和设置PythonWare XML-RPC库,这是Python中常用的XML-RPC实现之一。 - **数据类型**:讨论了Python中XML-RPC支持的数据类型。 - **客户端与服务端开发**:详细阐述了...

    QCon 2009 beijing全球企业开发大会ppt:3.Jeff Barr-Amazon Web Services

    ### QCon 2009 Beijing...AWS作为亚马逊的核心业务之一,不仅为企业提供了强大的技术支持,也为云计算行业的发展做出了贡献。通过这次演讲,听众可以更好地理解云计算的重要性,并开始思考如何将其应用于自己的业务中。

Global site tag (gtag.js) - Google Analytics