zoukankan      html  css  js  c++  java
  • 重温WCF之流与文件传输(七)

    WCF开启流模式,主要是设置一个叫TransferMode的属性,所以,你看看哪些Binding的派生类有这个属性就可以了。

    TransferMode其实是一个举枚,看看它的几个有效值:

    • Buffered:缓冲模式,说白了就是在内存中缓冲,一次调用就把整个消息读/写完,也就是我们最常用的方式,就是普通的操作协定的调用方式;
    • StreamedRequest:只是在请求的时候使用流,说简单一点就是在传入方法的参数使用流,如 int MyMethod(System.IO.Stream stream);
    • StreamedResponse:就是操作协定方法返回一个流,如 Stream MyMethod(string file_name);

    上传文件的例子:

    服务器端:

     [MessageContract]
        public class TransferFileMessage
        {
            [MessageHeader]
            public string FileName; //文件名  
            [MessageBodyMember]
            public Stream FileStream; //文件流  
        }
        [MessageContract]
        public class ResultMessage
        {
            [MessageHeader]
            public string ErrorMessage;
            [MessageBodyMember]
            public bool IsSuccessed;
        }  
    
        [ServiceContract]
        public interface IService
        {
            //消息契约作为传入参数,则只能有一个参数,返回值为void
            //如果需要返回值,则必须返回一个消息契约
            [OperationContract]
            ResultMessage UploadFile(TransferFileMessage fileMessage);
    
        }
    
        public class Service : IService
        {
            public ResultMessage UploadFile(TransferFileMessage fileMessage)
            {
                ResultMessage msg = new ResultMessage();
                try
                {
                    using (FileStream outputStream = new FileStream(fileMessage.FileName,FileMode.OpenOrCreate))
                    {
                        fileMessage.FileStream.CopyTo(outputStream);
                        outputStream.Flush();
                        msg.IsSuccessed = true;
                        Console.WriteLine("在{0}接收到客户端发送的流,已保存到{1}。", DateTime.Now.ToLongTimeString(), fileMessage.FileName);  
                    }
                }
                catch (Exception ex)
                {
                    msg.ErrorMessage = ex.Message;  
                    msg.IsSuccessed = false;
                }
                return msg;
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                using (ServiceHost host = new ServiceHost(typeof(Service)))
                {
                    BasicHttpBinding bingding = new BasicHttpBinding();
                    // 启用流模式  
                    bingding.TransferMode = TransferMode.StreamedRequest;
                    //缓存区的最大值
                    bingding.MaxBufferSize = 1024;
                    // 接收消息的最大范围为500M  
                    bingding.MaxReceivedMessageSize = 500*1024*1024;
                    host.AddServiceEndpoint(typeof(IService), bingding, "http://127.0.0.1:8888/service1");
                    ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
                    behavior.HttpGetEnabled = true;
                    behavior.HttpGetUrl = new Uri("http://127.0.0.1:8888/service");  //httpGetUrl客户端引用的地址
                    host.Description.Behaviors.Add(behavior);
                    host.Opened += delegate
                    {
                        Console.WriteLine("服务已启动");
                        Console.ReadKey();
                    };
                    host.Open();
                }
            }
        }

    客户端调用:

    private void button1_Click(object sender, EventArgs e)
            {
    
                OpenFileDialog ofd = new OpenFileDialog();
                if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    label1.Text = ofd.FileName;
                }
    
            }
    
            private async void button2_Click(object sender, EventArgs e)
            {
                if (!File.Exists(label1.Text))
                {
                    return;
                }
                using (FileStream fs = new FileStream(label1.Text, FileMode.Open, FileAccess.Read))
                {
                    using (ServiceClient client = new ServiceClient())
                    {
                       var result = await client.UploadFileAsync(Path.GetFileName(this.label1.Text),fs);
                       if (result.IsSuccessed)
                        {
                            MessageBox.Show("上传完成");
                        }
                    }
                }
              
            }
  • 相关阅读:
    Network Simulator for P4(NSP4) src内容介绍
    解决 E: Unable to correct problems, you have held broken packages. 问题
    【旧版本】Ubuntu 14.04 下 P416编译器 p4c的安装
    Ubuntu 14.04 更新gcc版本至4.9.2
    Ubuntu 14.04 下 安装Protocol Buffers
    Ubuntu 14.04 删除软件附加依赖
    解决Floodlight界面无法显示问题
    OpenVirteX 创建简易虚拟网络
    2017年P4中国峰会北京站 会议小结
    406. Queue Reconstruction by Height
  • 原文地址:https://www.cnblogs.com/yxlblogs/p/3779474.html
Copyright © 2011-2022 走看看