化零为整WCF(8) - 消息处理(使用流数据传输文件)

本文涉及的产品
数据传输服务 DTS,数据迁移 small 3个月
推荐场景:
MySQL数据库上云
数据传输服务 DTS,数据同步 small 3个月
推荐场景:
数据库上云
数据传输服务 DTS,数据同步 1个月
简介:
[索引页]
[源码下载] 


化零为整WCF(8) - 消息处理(使用流数据传输文件)


作者: webabcd


介绍
WCF(Windows Communication Foundation) - 消息处理:使用流数据传输文件,减少内存开销


示例
1、服务
IStreamed.cs
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Linq; 
InBlock.gif using System.Text; 
InBlock.gif 
InBlock.gif using System.ServiceModel; 
InBlock.gif using System.IO; 
InBlock.gif 
InBlock.gif namespace WCF.ServiceLib.Message 
InBlock.gif
InBlock.gif         /// <summary> 
InBlock.gif         /// 消息契约(定义与 SOAP 消息相对应的强类型类) 
InBlock.gif         /// </summary> 
InBlock.gif        [MessageContract] 
InBlock.gif         public  class FileWrapper 
InBlock.gif        { 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 指定数据成员为 SOAP 消息头 
InBlock.gif                 /// </summary> 
InBlock.gif                [MessageHeader] 
InBlock.gif                 public  string FilePath; 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 指定将成员序列化为 SOAP 正文中的元素 
InBlock.gif                 /// </summary> 
InBlock.gif                [MessageBodyMember] 
InBlock.gif                 public Stream FileData; 
InBlock.gif        } 
InBlock.gif 
InBlock.gif         /// <summary> 
InBlock.gif         /// IStreamed接口 
InBlock.gif         /// </summary> 
InBlock.gif        [ServiceContract] 
InBlock.gif         public  interface IStreamed 
InBlock.gif        { 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 上传文件 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <remarks> 
InBlock.gif                /// 1、支持数据流传输的绑定有:BasicHttpBinding、NetTcpBinding 和 NetNamedPipeBinding 
InBlock.gif                /// 2、流数据类型必须是可序列化的 Stream 或 MemoryStream 
InBlock.gif                // /3、传递时消息体(Message Body)中不能包含其他数据,即参数中只能有一个System.ServiceModel.MessageBodyMember 
InBlock.gif                /// </remarks> 

InBlock.gif                 /// <param name="fileWrapper">WCF.ServiceLib.Message.FileWrapper</param> 
InBlock.gif                [OperationContract] 
InBlock.gif                 void UploadFile(FileWrapper fileWrapper); 
InBlock.gif        } 
InBlock.gif}
 
Streamed.cs
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Linq; 
InBlock.gif using System.Text; 
InBlock.gif 
InBlock.gif using System.ServiceModel; 
InBlock.gif using System.IO; 
InBlock.gif 
InBlock.gif namespace WCF.ServiceLib.Message 
InBlock.gif
InBlock.gif         /// <summary> 
InBlock.gif         /// IStreamed类 
InBlock.gif         /// </summary> 
InBlock.gif         public  class Streamed : IStreamed 
InBlock.gif        { 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 上传文件 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="fileWrapper">WCF.ServiceLib.Message.FileWrapper</param> 
InBlock.gif                 public  void UploadFile(FileWrapper fileWrapper) 
InBlock.gif                { 
InBlock.gif                        var sourceStream = fileWrapper.FileData; 
InBlock.gif 
InBlock.gif                        var targetStream =  new FileStream(fileWrapper.FilePath, 
InBlock.gif                                FileMode.Create, 
InBlock.gif                                FileAccess.Write, 
InBlock.gif                                FileShare.None); 
InBlock.gif 
InBlock.gif                        var buffer =  new  byte[4096]; 
InBlock.gif                        var count = 0; 
InBlock.gif 
InBlock.gif                         while ((count = sourceStream.Read(buffer, 0, buffer.Length)) > 0) 
InBlock.gif                        { 
InBlock.gif                                targetStream.Write(buffer, 0, count); 
InBlock.gif                        } 
InBlock.gif 
InBlock.gif                        targetStream.Close(); 
InBlock.gif                        sourceStream.Close(); 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif}
 
2、宿主
Streamed.cs
InBlock.gif using (ServiceHost host =  new ServiceHost( typeof(WCF.ServiceLib.Message.Streamed))) 
InBlock.gif
InBlock.gif        host.Open(); 
InBlock.gif 
InBlock.gif        Console.WriteLine( "服务已启动(WCF.ServiceLib.Message.Streamed)"); 
InBlock.gif        Console.WriteLine( "按<ENTER>停止服务"); 
InBlock.gif        Console.ReadLine(); 
InBlock.gif 
InBlock.gif}
 
 
App.config
<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
        <services> 
            <!--name - 提供服务的类名--> 
            <!--behaviorConfiguration - 指定相关的行为配置--> 
            <service name="WCF.ServiceLib.Message.Streamed" behaviorConfiguration="MessageBehavior"> 
                <!--address - 服务地址--> 
                <!--binding - 通信方式--> 
                <!--contract - 服务契约--> 
                <!--bindingConfiguration - 指定相关的绑定配置--> 
                <endpoint address="Message/Streamed" binding="netTcpBinding" contract="WCF.ServiceLib.Message.IStreamed" bindingConfiguration="StreamedBindingConfiguration" /> 
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
                <host> 
                    <baseAddresses> 
                        <add baseAddress="http://localhost:12345/Message/Streamed/"/> 
                        <add baseAddress="net.tcp://localhost:54321/"/> 
                    </baseAddresses> 
                </host> 
            </service> 
        </services> 
        <behaviors> 
            <serviceBehaviors> 
                <behavior name="MessageBehavior"> 
                    <!--httpGetEnabled - 使用get方式提供服务--> 
                    <serviceMetadata httpGetEnabled="true" /> 
                    <serviceDebug includeExceptionDetailInFaults="true"/> 
                </behavior> 
            </serviceBehaviors> 
        </behaviors> 
        <bindings> 
            <netTcpBinding> 
                    <!--transferMode - 指示通道是使用流处理模式还是缓冲模式来传输请求和响应消息--> 
                    <!--maxReceivedMessageSize - 在采用此绑定配置的通道上可接收的最大消息大小(单位:字节)--> 
                    <!--receiveTimeout - 在传输引发异常之前可用于完成读取操作的时间间隔--> 
                    <binding name="StreamedBindingConfiguration" transferMode="Streamed" maxReceivedMessageSize="1073741824" receiveTimeout="00:10:00" /> 
            </netTcpBinding> 
        </bindings> 
    </system.serviceModel> 
</configuration>
 
 
3、客户端
Streamed.cs
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Linq; 
InBlock.gif using System.Text; 
InBlock.gif 
InBlock.gif using System.Windows.Forms; 
InBlock.gif using System.ServiceModel; 
InBlock.gif using System.IO; 
InBlock.gif 
InBlock.gif namespace Client2.Message 
InBlock.gif
InBlock.gif         /// <summary> 
InBlock.gif         /// 演示Message.Streamed的类 
InBlock.gif         /// </summary> 
InBlock.gif         public  class Streamed 
InBlock.gif        { 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 流数据上传文件 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="source">源文件地址</param> 
InBlock.gif                 /// <param name="destination">目标路径</param> 
InBlock.gif                 public  void HelloStreamed( string source,  string destination) 
InBlock.gif                { 
InBlock.gif                         try 
InBlock.gif                        { 
InBlock.gif                                var proxy =  new MessageSvc.Streamed.StreamedClient(); 
InBlock.gif 
InBlock.gif                                var sr =  new System.IO.FileStream( 
InBlock.gif                                        source, System.IO.FileMode.Open); 
InBlock.gif 
InBlock.gif                                proxy.UploadFile(destination + Path.GetFileName(source), sr); 
InBlock.gif 
InBlock.gif                                sr.Close(); 
InBlock.gif                                proxy.Close(); 
InBlock.gif 
InBlock.gif                                MessageBox.Show( "上传成功"); 
InBlock.gif                        } 
InBlock.gif                         catch (Exception ex) 
InBlock.gif                        { 
InBlock.gif                                MessageBox.Show(ex.ToString()); 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif}
 
App.config
<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
        <client> 
            <!--address - 服务地址--> 
            <!--binding - 通信方式--> 
            <!--contract - 服务契约--> 
            <endpoint address="net.tcp://localhost:54321/Message/Streamed" binding="netTcpBinding" contract="MessageSvc.Streamed.IStreamed" bindingConfiguration="StreamedBindingConfiguration" /> 
        </client> 
        <bindings> 
            <netTcpBinding> 
                    <!--transferMode - 指示通道是使用流处理模式还是缓冲模式来传输请求和响应消息--> 
                    <!--sendTimeout - 在传输引发异常之前可用于完成写入操作的时间间隔--> 
                    <binding name="StreamedBindingConfiguration" transferMode="Streamed" sendTimeout="00:10:00" /> 
            </netTcpBinding> 
        </bindings> 
    </system.serviceModel> 
</configuration>
 
运行结果:
上传文件后提示上传成功


OK
[源码下载]

     本文转自webabcd 51CTO博客,原文链接: http://blog.51cto.com/webabcd/344131 ,如需转载请自行联系原作者


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
Sqoop 企业级大数据迁移方案实战
Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。 本课程主要讲解了Sqoop的设计思想及原理、部署安装及配置、详细具体的使用方法技巧与实操案例、企业级任务管理等。结合日常工作实践,培养解决实际问题的能力。本课程由黑马程序员提供。
相关文章
|
网络协议 安全 Windows
|
前端开发
WCF更新服务引用报错的原因之一
WCF更新服务引用报错的原因之一
|
C# 数据安全/隐私保护
c#如何创建WCF服务到发布(SqlServer版已经验证)
c#如何创建WCF服务到发布(SqlServer版已经验证)
62 0
|
安全 数据库连接 数据库
WCF服务创建到发布(SqlServer版)
在本示例开始之前,让我们先来了解一下什么是wcf? wcf有哪些特点? wcf是一个面向服务编程的综合分层架构。该架构的项层为服务模型层。 使用户用最少的时间和精力建立自己的软件产品和外界通信的模型。它使得开发者能够建立一个跨平台的安全、可信赖、事务性的解决方案。且能与已有系统兼容写作。 简单概括就是:一组数据通信的应用程序开发接口。
93 0