** 应用 WSDK -实现和使用 DIME 的 Web Services **
小气的神
2002-10-20
Article Type: In-Depth
难度等级: 7/9
版本: 1.26
现在还很清晰的记得几乎是一年之前,自己使用 ASP.NET 做 A+ B 的简单 Web Services 。也记得那篇文章的题目很吸引人,叫什么《一步一步开始 Web Services 》。那也是我在 CSDN 的很早的几篇文章之一。不知不觉已经有近一年的时间了,当我看到 WSDK 并写这篇文章时,我开始有些怀念以前的文章。
今天我们来看一些有趣的应用,它们主要是根据微软最新的 Web Services 开发库 (Microsoft Web Services Development Kit Technology Preview Beta) 的一些 Web Services 的高级应用。尽管比起一年前的应用它进步了许多,给了 Web Services 许多想像和发展的空间。同时也指明未来微软对 Web Services 的支持和远景。但对于任何一个使用技术或对于 Web Services 发展的开发人员来说, Web Services 的发展依然还是太缓慢,每个里程碑都粒粒可数,一步一寸。 2001 年成立 WS - I.org, 2002 年 Web Services 的基础开发库进入 Beta 和发布,年底我们可能拿到正式的版本。但有关 Web services 安全和事务的规范和实现还是遥遥无期。
也许我们还有足够的耐心等待 Web Services 继续成长,也许它像专家预测的那样还有 5 年的时间发展完善。但有一点可以肯定,应用和学习 Web Services 可以从今天开始,从现在开始,事实上每个熟悉 Web Services 的人已经开始在他们的项目中应用 Web Services 。 Web Services 已经开始慢慢地影响我们应用程序的架构。当一项技术开始在不知不觉和无形中影响改变软件开发的编程和程序架构时,那么这种技术势必具有很强的生命力。 Java 如此、 Web Services 如此、 XML 如此、我喜欢的 dotNET 也是如此:)
今天的我们要看到的也十分简单,我们将使用 WSDK 中的新功能,在 Web Services 实现和使用 DIME 。这之前你需要了解什么是 DIME 、什么是 WSDK ,一些简单的 ASP.NET 的 Web Services 以及一些简单的操作,我保证这次不用 A+B 作为演示的范例。
如果你安装了 VS.NET ,那么你还需要做的是去这里 ** Download 下 WSDK ** 的开发包(微软附带的这两篇文章非常的棒,建议你一定抽空看),我知道这个预览版之前是叫 GXA ,还好最后改成 WSDK ,我不希望 GXA 和 dotNET 一样有太多的产品和概念充斥,从而变得含晦不清。啊,别问我:什么是 GXA
WSDK 的文档中也没有介绍什么是 DIME ,简单的说它就是在 Soap 的消息中附带二进制的数据,这意味着你不仅可以在 Web Services 传递文本和常用的数据类型,而且也可以传递和接受二进制的声音、图像和任何二进制的东东。 SOAP 基于客户 / 服务器端的,这也意味着 DIME 对于两者都必须透明和同时支持。
在 WSDK 没有发布前我们也是可以用 ASP.NET 来实现 DIME ,很笨 ( 后面我们会看到它的局限性 ) ,最重要的是没有一个统一的规范,对于这样的 Web Services 来说,客户端几乎根本或很难编程使用。下面我们实现一个简单的 DIME 应用的客户 / 服务端,同时也提一下如何使用 Microsoft SOAP Tookit v3 Trace utility ,我的朋友常告诉我说这个东东不知怎么用,也没有 PocketSoap 提供的 TCapTrace 好,也许是个人习惯,但 Trace utility 未必真的无法使用,明白了就很简单了。为了学习这个 Trace utility 的用法你还需要 ** Download Microsoft SOAP Toolkit 3.0 **
这样看来我们大概会做这样三件事,生成一个带有 DIME 的 Web Services ,产生一个 Client 消费这个 Web Services 。最后我们使用 Trace 进行跟踪。老实说,如果你明白 DIME 和 ASP.NET ,那么你会发现很多是熟悉新的设置工作而不是代码。
** 一.生成 Web Services ** ** 。 **
** ** 这是比较简单的,主要是一些设置,你需要在这里学会如何使用 WSDK ,同时学会设置增加或附加的 Web Services 。记得以前你是设置注册表,现在不同了,你需要跟 XML 的配置文档打交道。
首先我们 New 一个新的 ASP.NET 的 Web Services 的项目,之后你需要加 WSDK 的 Reference. 点击项目右键在下面的对话框中加入 WSDK 的引用。如下图:
然后在 ASMX 的代码中加入下面的代码:
using Microsoft.WSDK.Dime ;
using Microsoft.WSDK ;
using System.Net ; ** **
并且确认是否有 using System.Web; using System.Web.Services;
然后我们加入一个方法,代码如下:
[WebMethod]
public void GetdotNETToolsLog()
{
WebRequest WebReq = WebRequest.Create( "http://localhost/images/webFlag.png" ) ;
WebResponse WebRes = WebReq.GetResponse() ;
SoapContext respContext = HttpSoapContext.ResponseContext ;
DimeAttachment dimeAtt = new DimeAttachment( "image/jpeg", TypeFormatEnum.MediaType, WebRes.GetResponseStream() ) ;
respContext.Attachments.Add( dimeAtt ) ;
}
之后,可以保存编译我们的项目。看得出这段代码是要将一幅图片返回给请求这个 Web Services 方法的客户端。下面运行前的设置工作:
在 Solution explorer 中找到你这个项目的 Web.config 文件,双击到编辑模式,然后加下面的配置信息到该文件的
1<system.web></system.web>
中,我建议你最好加在 的前面一行。
< httpModules >
< add name ="WSDK" type ="Microsoft.WSDK.HttpModule, Microsoft.WSDK,Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
< webServices >
< soapExtensionTypes >
< add type ="Microsoft.WSDK.Dime.DimeExtension, Microsoft.WSDK, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" priority ="1" group ="0"/>
也许你会问这些东东我怎么知道,特别是 PublicKeytoken 简单一些你可以在 WSDK 的安装目录中找到 WSDK.config 这个文件中有你需要的所有有关 WSDK 的配置信息和格式。复杂一点你可以系统安装目录的 assembly 目录中找到 Microsoft.WSDK 然后按右键的属性中看到。再复杂一点你可以通过命令符方式: Gacutil –l Microsoft.WSDK 来获得你需要的信息,如果 gacutil 没有 dump 出你需要的 Microsoft.WSDK 的信息,那么可能很不幸,你的 WSDK 并没有安装正确。
当你完成设置之后,可以 F5 编译和运行这个有 DIME 功能的 Web Services 。如果结果显示那个你熟悉的 Web Services 蓝色界面那么这部分可以告一段落。不要试图点击 Html 上的调用 (Invoke) 按钮,因为你的浏览器并不能解释 DIME 的 SOAP 消息。
换作以前相同的代码可能是像下面这样的:
[WebMethod()]
public Byte[] GetImage()
{
string filename = "c:\\dotnetflag.jpg" ;
System.Drawing.Bitmap sampleBitmap = new System.Drawing.Bitmap( filename ) ;
System.IO.MemoryStream memStream = new System.IO.MemoryStream() ;
sampleBitmap.Save(memStream,System.Drawing.Imaging.ImageFormat.Jpeg ) ;
return memStream.ToArray() ;
}
你会说以前的简单,但是如果一个 SOAP 消息中带有不同的图片文件或混合的二进制数据,那么你会看到后面客户端很难消费这种 Web Services ,当然这篇文章我没有举这种情形的例子。
特别:
本文原创, CSDN 署名首发,所有文字和图片版权所有。未经授权请勿传播、转载或改编。
如果有问题或建议,请发电子邮件给 [email protected]