您的位置:首页 > 其它

化零为整WCF(7) - 消息处理(使用消息传输优化机制 - MTOM)

2008-04-17 08:33 609 查看
[索引页]
[源码下载]

[align=center]化零为整WCF(7) - 消息处理(使用消息传输优化机制 - MTOM)[/align]

作者:webabcd

介绍
WCF(Windows Communication Foundation) - 消息处理:MTOM(Message Transmission Optimization Mechanism) - 消息传输优化机制。本文以web方式上传大文件为例。

示例
1、服务
IMtom.cs


using System;


using System.Collections.Generic;


using System.Linq;


using System.Text;




using System.ServiceModel;


using System.IO;




namespace WCF.ServiceLib.Message


{


/// <summary>


/// IMtom接口


/// </summary>


[ServiceContract]


public interface IMtom


{


/// <summary>


/// 上传文件


/// </summary>


/// <param name="path">文件目标路径</param>


/// <param name="fileData">文件字节数组</param>


[OperationContract]


void UploadFile(string path, byte[] fileData);


}


}

Mtom.cs


using System;


using System.Collections.Generic;


using System.Linq;


using System.Text;




using System.ServiceModel;


using System.IO;




namespace WCF.ServiceLib.Message


{


/// <summary>


/// Mtom类


/// </summary>


public class Mtom : IMtom


{


/// <summary>


/// 上传文件


/// </summary>


/// <param name="path">文件目标路径</param>


/// <param name="fileData">文件字节数组</param>


public void UploadFile(string path, byte[] fileData)


{


FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None);


fs.Write(fileData, 0, fileData.Length);


fs.Flush();


fs.Close();


}


}


}

2、宿主
Mtom.svc

<%@ ServiceHost Language="C#" Debug="true" Service="WCF.ServiceLib.Message.Mtom" %>

Web.config

<?xml version="1.0"?>
<configuration>
<system.serviceModel>
<services>
<!--name - 提供服务的类名-->
<!--behaviorConfiguration - 指定相关的行为配置-->
<service name="WCF.ServiceLib.Message.Mtom" behaviorConfiguration="MessageBehavior">
<!--address - 服务地址-->
<!--binding - 通信方式-->
<!--contract - 服务契约-->
<!--bindingConfiguration - 指定相关的绑定配置-->
<endpoint address="" binding="wsHttpBinding" contract="WCF.ServiceLib.Message.IMtom" bindingConfiguration="MtomBindingConfiguration" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="MessageBehavior">
<!--httpGetEnabled - 使用get方式提供服务-->
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<wsHttpBinding>
<!--messageEncoding - 指定用 MTOM 还是 Text 对 SOAP 消息编码-->
<!--maxReceivedMessageSize - 在采用此绑定配置的通道上可接收的最大消息大小(单位:字节)-->
<!--receiveTimeout - 在传输引发异常之前可用于完成读取操作的时间间隔-->
<binding name="MtomBindingConfiguration" messageEncoding="Mtom" maxReceivedMessageSize="1073741824" receiveTimeout="00:10:00">
<!--maxArrayLength - 配额控制:允许的最大数组长度-->
<readerQuotas maxArrayLength="1073741824" />
</binding>
</wsHttpBinding>
</bindings>
</system.serviceModel>
</configuration>

3、客户端
Mtom.aspx

<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Mtom.aspx.cs"
Inherits="Message_Mtom" Title="消息处理(使用消息传输优化机制 - MTOM)" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
<p>
MTOM(Message Transmission Optimization Mechanism) - 消息传输优化机制
</p>
<div>
<ul>
<li>可以指定用 MTOM 还是 Text 对 SOAP 消息编码</li>
<li>抓soap消息的时候可以用tcpTrace</li>
<li>用17,766,901字节大小的文件测试:Text编码(soap大小:31,591,929字节);MTOM编码(soap大小:23,696,066字节)</li>
</ul>
</div>
<div>
源文件:
<asp:FileUpload ID="file" runat="server" />

上传路径:
<asp:TextBox ID="txtDestination" runat="server" Text="C:\"></asp:TextBox>

<asp:Button ID="btnUpload" runat="server" Text="上传" OnClick="btnUpload_Click" />
</div>
</asp:Content>

Mtom.aspx.cs


using System;


using System.Collections;


using System.Configuration;


using System.Data;


using System.Linq;


using System.Web;


using System.Web.Security;


using System.Web.UI;


using System.Web.UI.HtmlControls;


using System.Web.UI.WebControls;


using System.Web.UI.WebControls.WebParts;


using System.Xml.Linq;


using System.ServiceModel.Channels;


using System.IO;




public partial class Message_Mtom : System.Web.UI.Page


{


protected void Page_Load(object sender, EventArgs e)


{




}




protected void btnUpload_Click(object sender, EventArgs e)


{


var proxy = new MessageSvc.Mtom.MtomClient();




var length = file.PostedFile.ContentLength;


var bytes = new byte[length];


file.PostedFile.InputStream.Read(bytes, 0, length);




try


{


proxy.UploadFile(


txtDestination.Text + Path.GetFileName(file.PostedFile.FileName),


bytes);


Page.ClientScript.RegisterStartupScript(typeof(Page), "js", "alert('上传成功');", true);


}


catch (Exception ex)


{


Page.ClientScript.RegisterStartupScript(typeof(Page), "js", "alert('" + ex.ToString() + "');", true);


}




proxy.Close();


}


}

Web.config

<?xml version="1.0"?>
<configuration>
<system.serviceModel>
<client>
<!--address - 服务地址-->
<!--binding - 通信方式-->
<!--contract - 服务契约-->
<!--bindingConfiguration - 指定相关的绑定配置-->
<!--behaviorConfiguration - 指定相关的行为配置-->
<!--endpoint address="http://localhost:3502/ServiceHost/Message/Mtom.svc" binding="wsHttpBinding" contract="MessageSvc.Mtom.IMtom" bindingConfiguration="MtomBindingConfiguration" behaviorConfiguration="MtomEndpointBehavior" /-->
<endpoint address="http://localhost:3502/ServiceHost/Message/Mtom.svc" binding="wsHttpBinding" contract="MessageSvc.Mtom.IMtom" bindingConfiguration="MtomBindingConfiguration" />
</client>
<bindings>
<wsHttpBinding>
<!--messageEncoding - 指定用 MTOM 还是 Text 对 SOAP 消息编码-->
<!--sendTimeout - 在传输引发异常之前可用于完成写入操作的时间间隔-->
<binding name="MtomBindingConfiguration" messageEncoding="Mtom" sendTimeout="00:10:00">
<!--maxArrayLength - 配额控制:允许的最大数组长度-->
<readerQuotas maxArrayLength="1073741824" />
</binding>
</wsHttpBinding>
</bindings>
<behaviors>
<endpointBehaviors>
<behavior name="MtomEndpointBehavior">
<!--clientVia - 创建传输通道的 URI (tcpTrace抓soap的时候用)-->
<clientVia viaUri="http://localhost:8888/ServiceHost/Message/Mtom.svc" />
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
</configuration>

运行结果:
上传文件后提示上传成功

OK
[源码下载]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息