火星文 技术研习社

Noname Cat, Keep Thinking
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

WebService 项目实践笔记

Posted on 2006-04-06 10:34  剑廿三  阅读(1497)  评论(0编辑  收藏  举报

注:笔记内容本来就这么多,其他都应该属于商业机密。


要点

1. WebService 类,如 Syc.asmx.cs 中的 class Syc ,即拥有 WebMethod 的类。
2. WebService 类,要继承自 System.Web.Services.WebService。
3. WebService 类,要引用 System.Web.Services 命名空间
4. WebService 类,不需要每个方法都标为 [WebMethod] ,只是公开的接口方法需要。
5. 可序列化的实体对象,即作为 WebMethod 返回的对象实体类
6. 可序列化的实体对象,必须有 [Serializable] 标记
7. 可序列化的实体对象,要引用 System.Xml.Serialization 命名空间
8. 可序列化的实体对象,在经过 WebService 传递后,仍可按类实例使用它的属性和方法
9. 可序列化的实体对象,可以拥有一对针对有价值内容的 getter / setter 方法
10. 压缩除了为了节省传输数据量,也为了在一定程度上的数据保密
11. KEY 密钥 和 Auth 验证码生成方法是为了通信前的安全验证。
12. 实体对象的编号 ID 属性 通常是 32位 GUID。不仅保证唯一,也为了支持数据的分布式 Insert。
13. Web 服务提供端(响应端)仅仅需要编写 *.asmx (.cs)  和 可序列化的实体对象。wsdl 文档、SOAP 代理程序使用 Microsoft ASP.NET 工具自动生成。
14. 请求端在获得包括了 WebService 代理类和可序列化对象实体类的 SOAP 代理程序文件后,可以像调用本地类库一样使用这些代码。
15. 对于不同版本的 ASP.NET 或者完全不同的运行环境,例如 Mono,交换的接口文件应是 WSDL 文档。

参考阅读

Microsoft ASP.NET QuickStart 快速入门教程 Web 服务章节(xxxClient 即为服务请求端)
http://chs.gotdotnet.com/quickstart/aspplus/doc/writingservices.aspx 

Web Service 类声明

[WebService(Namespace="http://www.abc123.com/WebService/")]
public class Syc
{
......
}

注意:不加标注也是可以的,加标注仅仅是为了声明命名空间。

Web Service 方法声明

[WebMethod(Description=".....")]
public  返回值 方法名 ( 参数表 )
{

返回的对象必须是 序列化对象
对象有效数据可以是 DataSet ,
如果需要压缩,则数据应该是 XML 或者文本内容 (字节数组)

}

[Serializable]
对象实体类

(与 UI 同级)
WebService \ UsersEntity.cs

主要属性:
属性 Users - 字节数组
int result
string ErrorString
string CRC
public void SetUserData (ds) —— ( ds --> xml --> ZIP 压缩 )
public void SetResult ( resultCode)

同步接口
WebService \ Syc.asmx.cs  - 公共 WebService 方法 [WebMethod]

主要方法:
public string CreateAuth( string entityID, string entityName, string key  ) - 生成验证码

public bool CheckAuth( string auth ) - 检查验证码

[WebMethod]
public UsersEntity GetOrgUsers (string  orgID, string auth )
方法主要流程:
checkAuth ( orgID, auth )
SetResult ( resultCode )
调用 DataProvider 做 select 返回 ds
调用 UsersEntity 设定数据 (ds)
返回 UsersEntity

数据接口(做 select 返回 ds)
类库 \ Data \ DataProvider.cs

主要方法:
public DataSet GetOrgUsersRequest (string orgID)
{
DataSet ds = new DataSet();
dataHelper.FillDataSet ( ...., sql, ds, dtName );
return ds;
}

测试用例

1.
string key = "  n 位密钥 ";  // 公钥
Syc syc = new Syc(); // 加载同步接口
string auth = syc.CreateAuth (entityID, entityName, key);  // 生成验证码

2. Console.WriteLine( auth );  // 得到验证码(公钥)

3.
WebService / UsersEntity res = syc.GetOrgUsers ("1", auth); // 调用同步接口的 WebMethod
byte[] r = Zip.DecompressData ( res.Users ); // 解压 XML(DS)数据

4. Console.WriteLine (System.Text.Encoding.UTF8.GetString ( r ));  // 用 UTF8 输出用户结果数据(XML文本)

测试用例流程

1. 验证码:对公钥 KEY  用当前时间 SHA1 加密
(请求方提供 明文要素 和 加密结果 给响应方,响应方看看用明文要素能不能生成发过来的加密结果)

2. 用同步接口 [WebMethod] 取数据(调用数据接口)

(返回)得到一个序列化的实体对象(.NET对象)

3. 从序列化对象方法取得字节数组

4. 解压(ZIP)

5. 得到(XML)文本

为服务请求端作准备-1. 生成 WSDL 接口文档 (XML 格式接口 API)

1. 在浏览器地址栏输入:

http://localhost/.........../Syc.asmx?WSDL

2. 把网页另存为 XML 格式的 Syc.wsdl 文件,在下一节会用到。

为服务请求端作准备- 2. 生成 SOAP  代理(提供给服务请求端的 C# 程序)

1. 开启命令行方式

2. Microsoft WSDL 转换工具的使用方法:

Microsoft (R) Web 服务描述语言实用工具
[Microsoft (R) .NET Framework,版本 1.1.4322.573]
Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.


wsdl.exe -
    用于从 WSDL 协定文件、XSD 架构和 .discomap 发现文档,
    为使用 ASP.NET 的 Xml Web service 客户端和 Xml Web services 生成代码的实用工
具。
    此工具可以与 disco.exe 一起使用。

wsdl.exe 
<选项> <URL 或路径> <URL 或路径> 

     - 选项 -

<url or path> -
    WSDL 协定、XSD 架构或 .discomap 文档的 URL 或路径。

/nologo
    取消显示版权标志。

/language:
<language>
    用于生成的代理类的语言。从“CS”、
    “VB”、“JS”、“VJS”中选择,或者为实现
    System.CodeDom.Compiler.CodeDomProvider 的类提供完全限定的名称。默认为“CS”

(CSharp)。缩写为“/l:”。

/server
    基于协定,为使用 ASP.NET 的 Xml Web service 实现生成抽象类。
    默认为生成客户端代理类。

/namespace:
<namespace>
    生成的代理或模板的命名空间。默认命名空间
    为全局命名空间。缩写为“/n:”。

/out:
<fileName>
    生成的代理代码的文件名。默认名称是从
    服务名派生的。缩写为“/o:”。

/protocol:
<protocol>
    重写要实现的默认协议。从“SOAP”、“SOAP12”、
“HttpGet”、“HttpPost”或配置文件中指定的自定义协议中选择。

/username:
<username>
/password:
<password>
/domain:
<domain>
    连接到要求身份验证的
    服务器时使用的凭据。缩写为“/u:”、“/p:”和“/d:”。

/proxy:
<url>
    用于 HTTP 请求的代理服务器的 URL。
    默认为使用系统代理设置。

/proxyusername:
<username>
/proxypassword:
<password>
/proxydomain:
<domain>
    连接到要求身份验证的代理服务器时使用的凭据。
    缩写为“/pu:”、“/pp:”和“/pd:”。

/appsettingurlkey:
<key>
    在代码生成中用来读取 URL 属性的默认值的配置项。默认为不从配置
    文件中读取。缩写为“/urlkey:”。

/appsettingbaseurl:
<baseurl>
    计算 URL 段时使用的基 URL。
    还必须指定 appsettingurlkey 选项。URL 段是
    从 appsettingbaseurl 计算
     WSDL 文档中的 URL 的相对 URL 的结果。缩写为“/baseurl:”。

/parsableerrors
    输出错误,其格式与编译器报告的格式类似。


3. 在命令行执行 wsdl.exe 命令:

F:\WorkPlace\MyProject\WebService>"C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin\wsdl.exe" /l:CS /n:SOAP代理类的命名空间 /out:SOAP代理类的C#文件名.cs WSDL源文件.wsdl

例如:

F:\WorkPlace\MyProject\WebService>"C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin\wsdl.exe" /l:CS /n:StephenCat.WebService.SycService /out:SycService.cs syc.wsdl

执行后的屏幕输出内容:

Microsoft (R) Web 服务描述语言实用工具
[Microsoft (R) .NET Framework,版本 1.1.4322.573]
Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.

正在写入文件“SycService.cs”。

所成生的 SOAP 代理文件包含以下内容:

1. 与 WebService 类同名、拥有相同方法的代理类,如 class Syc
2. WebService 类中使用到的所有可序列化对象实体类,如 class UsersEntity
3. 以上所有类被包含在同一个命名空间中,该命名空间在命令行执行 wsdl 的参数中指定。


服务请求端调用 Syc 同步接口

参见《微软 ASP.NET 快速入门教程 Web服务示例》:
http://chs.gotdotnet.com/quickstart/util/srcview.aspx?path=/quickstart/aspplus/samples/services/DataTypes/DataTypesClient.src&file=CS\DataTypesClient.aspx&font=3

由 WDSL 产生的SOAP代理文件:
http://chs.gotdotnet.com/quickstart/util/srcview.aspx?path=/quickstart/aspplus/samples/services/DataTypes/DataTypesClient.src&file=CS\DataTypes.cs&font=3

其中:
DataTypes 是 SOAP 代理类
Order 是对象实体类