注:笔记内容本来就这么多,其他都应该属于商业机密。
要点
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) .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) .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 是对象实体类