应用WSDK-实现和使用DIME的Web Services(上)

类别:.NET开发 点击:0 评论:0 推荐:

应用WSDK-实现和使用DIMEWeb 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年成立WSI.org, 2002Web Services的基础开发库进入Beta和发布,年底我们可能拿到正式的版本。但有关Web services安全和事务的规范和实现还是遥遥无期。

 

       也许我们还有足够的耐心等待Web Services继续成长,也许它像专家预测的那样还有5年的时间发展完善。但有一点可以肯定,应用和学习Web Services可以从今天开始,从现在开始,事实上每个熟悉Web Services的人已经开始在他们的项目中应用Web ServicesWeb Services已经开始慢慢地影响我们应用程序的架构。当一项技术开始在不知不觉和无形中影响改变软件开发的编程和程序架构时,那么这种技术势必具有很强的生命力。Java如此、Web Services如此、XML如此、我喜欢的dotNET也是如此:)

 

       今天的我们要看到的也十分简单,我们将使用WSDK中的新功能,在Web Services实现和使用DIME。这之前你需要了解什么是DIME、什么是WSDK,一些简单的ASP.NETWeb Services以及一些简单的操作,我保证这次不用A+B作为演示的范例。

 

       如果你安装了VS.NET,那么你还需要做的是去这里DownloadWSDK的开发包(微软附带的这两篇文章非常的棒,建议你一定抽空看),我知道这个预览版之前是叫GXA,还好最后改成WSDK,我不希望GXAdotNET一样有太多的产品和概念充斥,从而变得含晦不清。啊,别问我:什么是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

 

这样看来我们大概会做这样三件事,生成一个带有DIMEWeb Services,产生一个Client消费这个Web Services。最后我们使用Trace进行跟踪。老实说,如果你明白DIMEASP.NET,那么你会发现很多是熟悉新的设置工作而不是代码。

 

一.生成Web Services

 

       这是比较简单的,主要是一些设置,你需要在这里学会如何使用WSDK,同时学会设置增加或附加的Web Services。记得以前你是设置注册表,现在不同了,你需要跟XML的配置文档打交道。

       首先我们New一个新的ASP.NET Web Services的项目,之后你需要加WSDKReference.点击项目右键在下面的对话框中加入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文件,双击到编辑模式,然后加下面的配置信息到该文件的<system.web></system.web>中,我建议你最好加在</system.web>的前面一行。

<httpModules>

<add name="WSDK" type="Microsoft.WSDK.HttpModule, Microsoft.WSDK,Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />

</httpModules>

 

<!--

   The following section is required when the DIME feature of the WSDK is used.

-->

<webServices>

   <soapExtensionTypes>

      <add type="Microsoft.WSDK.Dime.DimeExtension, Microsoft.WSDK, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" priority="1" group="0"/>

</soapExtensionTypes>

</webServices>

 

也许你会问这些东东我怎么知道,特别是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)按钮,因为你的浏览器并不能解释DIMESOAP消息。

 

换作以前相同的代码可能是像下面这样的:

[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]

 

本文地址:http://com.8s8s.com/it/it45903.htm