65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 WSE 2.0 配置 DIME

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.34/5 (23投票s)

2004年10月28日

CPOL

6分钟阅读

viewsIcon

240016

downloadIcon

1465

本文着重演示 DIME(Direct Internet Message Encapsulation)与 Web Services 的用法。在这里,你将有两个应用程序,一个是 Web Serivice,它使用 DIME 技术将附件(不同类型)发送到客户端,另一个是 Windows Forms 应用程序。

引言

SOAP 消息并不是发送大型二进制文件的最佳方式。随着 Web Services 的出现,人们希望 Web Services 拥有越来越多的功能。结果是引入了 Web Services Enhancement (WSE) 2.0。Microsoft .NET 的 Web Services Enhancements (WSE) 支持将文件附加到 SOAP 消息的 SOAP 信封外部;这些文件不会序列化为 XML。这在发送大型文本或二进制文件时会很有益,因为 XML 序列化是一个非常耗费成本的过程,并且可能导致文件比原始文件大得多。Direct Internet Message Encapsulation (DIME) 是一种轻量级的二进制消息格式,WSE 使用它将 SOAP 消息及其附件封装在 DIME 消息中。

背景

  • 首先,我们创建一个 Web 服务,它可以读取图像文件,并返回一个包含 SOAP 消息和附加图像文件的 DIME 消息。
  • 其次,我们创建一个 Windows Forms 客户端,它可以消费 Web 服务创建的 DIME 消息并显示图像。

要求

阅读本文的用户需要对 Web 服务以及如何使用 .NET Framework 创建和使用它们有基本的了解。此外,他们需要安装 Microsoft Visual Studio .NET 2003 和 Web Service Enhancement 2.0。

生成包含图像附件的 DIME 消息的 Web 服务

注意:由于 DIME 附件包含在 SOAP 信封之外,因此无法使用 WSE 对其进行签名或加密。强烈建议通过安全传输协议(例如 HTTPS)发送包含 DIME 附件的所有 SOAP 消息。

注意:如果您将文件作为 DIME 附件发送,则无法从发送该文件的 Web 方法中关闭或删除该文件。这是因为 WSE 会保留对文件的引用,直到消息被序列化并传递给客户端。为了克服这个问题,请覆盖文件流并在释放对文件流的所有引用时删除文件。

让我们创建 Visual Studio ASP/.NET Web 服务项目

  1. 转到文件菜单并创建新项目
  2. 项目类型窗格中,选择Visual C# 项目
  3. 模板窗格中,选择ASP.NET Web 服务
  4. 位置框中填写项目名称:https:///MyDimeTest
  5. 单击确定按钮将MyDimeTest项目添加到解决方案中。
  6. 转到解决方案资源管理器并通过选择文件的属性将Service1.asmx的名称更改为DimeService.asmx
  7. 更智能的做法是,查看DimeService.asmx并更改类名以及构造函数名,使其具有相同的名称,即"DimeService"

    现在项目已经完成,现在你需要为 WSE 2.0 配置项目。这非常简单。

  8. 解决方案资源管理器中,右键单击项目名称,您将在“属性”菜单项下方看到“WSE 2.0 设置...”。
  9. 选择“WSE 2.0 设置...”。
  10. 要配置 Web 服务项目以使用 WSE 2.0,您需要在“常规”选项卡中选中两个复选框。

    • 第一个复选框启用当前项目与 WSE 的使用。这意味着 Microsoft.Web.Services2.dll 将被添加到项目引用中,并且将对 Web.config 文件进行更改以添加对 WSE 配置处理程序的S支持。此外,从此点开始创建的任何 Web 引用都将在生成的代理类中包含 WSE 2.0 支持。
    • 只有当这是一个 ASP.NET Web 服务项目时,第二个复选框才会被启用。通过选择它,WSE Soap 扩展将被添加到项目中,这将使附加协议支持在 ASP.NET Web 服务 HTTP 处理程序(用于 .ASMX 文件)中工作。这是通过修改 Web.config 文件并将 WSE SOAP 扩展添加到虚拟目录的 .asmx SOAP 扩展列表中来实现的。
  11. using 语句添加到 DimeService.asmx.cs 文件
    using Microsoft.Web.Services2.Dime;
    using Microsoft.Web.Services2;
    using System.Net;
  12. 放置一个要由 DimeService 读取的图像文件。在我的例子中,我将一个“test.gif”文件放在我的“c:”驱动器中。因此图像文件的路径被描述为“c:\test.gif”。
  13. 编写一个 Web 方法,可以读取图像文件并使用 DIME 技术将其附加到 SOAP 消息中并将其传输到客户端。请按照以下代码操作
    // The CreateDimedImage Web service returns an image in a DIME
    // attachment.
    [WebMethod]
    public void CreateDimedImage()
    {
        SoapContext respContext = ResponseSoapContext.Current;
        DimeAttachment dimeAttach = new DimeAttachment(
            "image/gif", TypeFormat.MediaType,
            "C:\\test.gif");
        respContext.Attachments.Add(dimeAttach);
    }

    编译项目。现在您已经完成了 Web 服务端。

可以消费包含图像的 DIME 消息的 Windows Forms 客户端

让我们创建 Windows Forms 项目

  1. 转到文件菜单并创建新项目
  2. 项目类型窗格中,选择Visual C# 项目
  3. 模板窗格中,选择Windows 应用程序
  4. 名称框中填写项目名称:DimeClient
  5. 单击确定按钮将DimeClient项目添加到解决方案中。
  6. 解决方案资源管理器中,为 DimeClient Windows 窗体选择查看设计器
  7. 工具栏向窗体添加一个 PictureBox 控件。
  8. 双击 DimeClient Form 以添加 Form_Load 事件。

    现在客户端项目已经完成,现在你需要为 WSE 2.0 配置项目。这非常简单。

  9. 解决方案资源管理器中,右键单击项目名称,您将在“属性”菜单项下方看到“WSE 2.0 设置...”。
  10. 选择“WSE 2.0 设置...”。
  11. 要配置 Web 服务项目以使用 WSE 2.0,您需要在“常规”选项卡中选中第一个复选框。(即,为此项目启用 Web 服务增强功能。)这将添加所有必要的引用,并且还会为您编辑 Web.Config
  12. 解决方案资源管理器中,右键单击引用,然后选择添加 Web 引用
  13. 在地址窗口中,输入https:///MyDimeTest/DimeService.asmx,然后单击箭头图标。
  14. 将您的代理类命名为“pxy”并单击添加引用
  15. 将以下代码插入到“DimeClient.cs”的“Form_Load”方法中。
    private void Form1_Load(object sender, System.EventArgs e)
    {
        pxy.DimeServiceWse lobjProxy = new pxy.DimeServiceWse();
        lobjProxy.CreateDimedImage();
        if (lobjProxy.ResponseSoapContext.Attachments.Count == 1)
        {
            this.pictureBox1.Image = new Bitmap(
                        lobjProxy.ResponseSoapContext.Attachments[0].Stream);
        }
        else
        {
            MessageBox.Show("No Attachment Found");
        }
    }

DIME 默认值

默认情况下,DIME/WSE 2.0 不允许添加/发送大于 4096 KB 的附件。如果您打算发送大于 4 MB 限制(包括 SOAP 消息)的文件,您需要向服务的 web.config 文件以及接收方(客户端)添加一些标签。您需要添加值来覆盖 maxRequestLength 的值。

<httpRuntime> 设置

这配置了 ASP.NET HTTP 运行时设置。此部分可以在机器、站点、应用程序和子目录级别声明

<httpRuntime useFullyQualifiedRedirectUrl="true|false"
  maxRequestLength="size in kbytes"
  executionTimeout="seconds" />

示例

此示例演示了发送一个大小为 8 MB 的附件,超时设置为 45 秒的实例

<configuration>
   <system.web>
      <httpRuntime maxRequestLength="8000"
                   useFullyQualifiedRedirectUrl="true"
                   executionTimeout="45" />
    </system.web>
</configuration>

<microsoft.web.services2> 设置

<microsoft.web.services2>
    <messaging>
      <maxRequestLength>"size in kbytes"</maxRequestLength>
    </messaging>
    <diagnostics />
</microsoft.web.services2>

示例

<configuration>
  <microsoft.web.services2>
    <messaging>
      <maxRequestLength>8000</maxRequestLength>
    </messaging>
    <diagnostics />
  </microsoft.web.services2>
</configuration>

最后更新

本文于 2005 年 4 月 19 日更新。

© . All rights reserved.