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
    [源码下载]
  • 相关阅读:
    python中__init__和__call__的区别
    scrapy在start_requests中传入参数给parser
    crawl: error: Unrecognized output format 'json''
    判断一个点是否在多边形区域内部 / 判断一个给定位置是否位于某个城市内部
    scrapy爬取页面不完全的解决办法
    module 'tensorflow._api.v2.train' has no attribute 'rmspropoptimizer'
    tf.image.resize处理后的图片无法使用plt.imshow正常显示
    如何将tensor大于某个值为1,小于某个值为0
    Blas GEMV launch failed: m=3, n=10000
    sql 批量插入 insert
  • 原文地址:https://www.cnblogs.com/webabcd/p/1157285.html
Copyright © 2011-2022 走看看