zoukankan      html  css  js  c++  java
  • 化零为整WCF(7) 消息处理(使用消息传输优化机制 MTOM)

    [索引页]
    [源码下载]


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


    作者: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" />
            
    &nbsp;
            上传路径:
            
    <asp:TextBox ID="txtDestination" runat="server" Text="C:\"></asp:TextBox>
            
    &nbsp;
            
    <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
    [源码下载]
  • 相关阅读:
    [转]对Lucene PhraseQuery的slop的理解
    Best jQuery Plugins of 2010
    15 jQuery Plugins To Create A User Friendly Tooltip
    Lucene:基于Java的全文检索引擎简介
    9 Powerful jQuery File Upload Plugins
    Coding Best Practices Using DateTime in the .NET Framework
    Best Image Croppers ready to use for web developers
    28 jQuery Zoom Plugins Creating Stunning Image Effect
    VS2005 + VSS2005 实现团队开发、源代码管理、版本控制(转)
    禁止状态栏显示超链
  • 原文地址:https://www.cnblogs.com/webabcd/p/1157285.html
Copyright © 2011-2022 走看看