none
WCF流操作 RRS feed

  • 问题

  • 契约:

    [ServiceContract]
        public  interface IMyContract
        {

         /// <summary>
            /// 客户端向服务端传输文件
            /// </summary>
            /// <param name="localFilePath">客户端文件路径</param>
            /// <param name="remoteSavePath">服务端文件路径</param>
            /// <returns>true 成功 false 失败</returns>
            [OperationContract]
            bool ClientToServerFile(string ClientFilePath, string ServerSavePath);
        }

    数据契约:

     [DataContract]
        public class MyData
        {
            private string DataPath = String.Empty;
            private string SavePath;
            private Stream FileData;
            private string FileName;

            /// <summary>
            /// 文件保存路径
            /// </summary>
            [DataMember]
            public string SavePath1
            {
                get { return SavePath; }
                set { SavePath = value; }
            }
            /// <summary>
            /// 文件名称
            /// </summary>
             [DataMember]
            public string FileName1
            {
                get { return FileName; }
                set { FileName = value; }
            }
             /// <summary>
             /// 文件
             /// </summary>
             [DataMember]
            public Stream FileData1
            {
                get { return FileData; }
                set { FileData = value; }
            }

            [DataMember]
            public string DataPath1
            {
                get { return DataPath; }
                set { DataPath = value; }
            }

        }

    服务器端的实现:

    public class MyContract :IMyContract
        {
            #region 上传
            /// <summary>
            /// 客户端向服务端传输文件
            /// </summary>
            /// <param name="localFilePath">客户端文件路径</param>
            /// <param name="remoteSavePath">服务端文件路径</param>
            /// <returns>true 成功 false 失败</returns>
            public bool ClientToServerFile(string ClientFilePath, string ServerSavePath)
            {
                MyData file = null;
                bool IsSucceed = false;
                try
                {
                    file = new MyData();
                    file.FileName1 = Path.GetFileName(ClientFilePath);
                    file.SavePath1 = ServerSavePath;
                    file.FileData1 = new FileStream(ClientFilePath, FileMode.Open);

                    Upload(file);
                    IsSucceed = true;
                }
                catch (FaultException ex)
                {
                    throw new Exception("服务端错误" + ex.Message);
                }
                catch (Exception ex)
                {
                    throw new Exception("客户端错误:" + ex.Message);
                }
                finally
                {
                    if (file.FileData1 != null)
                    {
                        file.FileData1.Close();
                    }
                }
                return IsSucceed;
            }
            private void Upload(MyData request)
            {
                try
                {
                    string savaPath = request.SavePath1;
                    string fileName = request.FileName1;
                    //  Stream sourceStream = request.FileData;
                    FileStream targetStream = null;
                    //判断文件是否可读
                    if (!request.FileData1.CanRead)
                    {
                        FaultException fault = null;
                        fault = new FaultException("数据流不可读");

                        throw fault;

                    }
                    string DirectoryName = Path.GetDirectoryName(savaPath);
                    //创建保存文件夹
                    if (!Directory.Exists(DirectoryName))
                    {
                        Directory.CreateDirectory(DirectoryName);
                    }

                    int fileSize = 0;


                    //文件流传输
                    using (targetStream = new FileStream(savaPath, FileMode.Create, FileAccess.Write, FileShare.None))
                    {
                        //定义文件缓冲区
                        const int bufferLen = 4096;
                        byte[] buffer = new byte[bufferLen];
                        int count = 0;

                        while ((count = request.FileData1.Read(buffer, 0, bufferLen)) > 0)
                        {
                            targetStream.Write(buffer, 0, count);
                            fileSize += count;
                        }
                    }
                    targetStream.Close();

                    request.FileData1.Close();
                }
                catch (Exception ex)
                {
                    FaultException fault = null;
                    fault = new FaultException(ex.Message);
                    throw fault;

                }

            }
            #endregion
        }

        //// <summary>
        /// 结构。硬盘信息
        /// </summary>
        public struct DiskInfo
        {
            public string RootPathName;
            //每簇的扇区数
            public int SectorsPerCluster;
            //每扇区字节
            public int BytesPerSector;
            public int NumberOfFreeClusters;
            public int TotalNumberOfClusters;
        }

    服务器的调用:(打开服务方法)

                   

     ServiceHost MyHost;
            string AddressStr = "net.tcp://192.168.1.186:8002/test";
            /// <summary>
            /// 打开服务
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void button1_Click_1(object sender, RoutedEventArgs e)
            {
                try
                {
             //          <binding name="MyBasicBinding" receiveTimeout="00:30:00"   
             //messageEncoding="Mtom" maxReceivedMessageSize="9223372036854775807"  
             //transferMode="Streamed" sendTimeout="00:30:00" />  
                    MyHost = new ServiceHost(typeof(MyContract));
                    NetTcpBinding Mytcp = new NetTcpBinding();
                    Mytcp.Security.Mode = SecurityMode.None;
                    Mytcp.TransferMode = TransferMode.Streamed;//流模式传输
                    Mytcp.MaxReceivedMessageSize = 9223372036854775807;
                    Mytcp.SendTimeout = new TimeSpan(0, 30, 0);
                    Mytcp.ReceiveTimeout = new TimeSpan(0, 30, 0);
                    MyHost.AddServiceEndpoint(typeof(IMyContract), Mytcp, AddressStr);
                    MyHost.Open();
                    lab_State.Content = "服务以打开";
                    //listBox1.Items.Add("打开的端口:" + MyHost.BaseAddresses[0].Port.ToString());
                    //listBox1.Items.Add("打开的IP:" + MyHost.BaseAddresses[0].Host.ToString());
                }
                catch (Exception ex)
                {

                    MessageBox.Show(ex.ToString());
                }
            }

    客户端上传:

        IMyContract Mycontract;

       /// <summary>
            /// 实例接口
            /// </summary>
            public void GetObject()
            {
                NetTcpBinding Mytcp = new NetTcpBinding();
                Mytcp.Security.Mode = SecurityMode.None;
                Mytcp.TransferMode = TransferMode.Streamed;//流模式传输
                Mytcp.MaxReceivedMessageSize = 9223372036854775807;
                Mytcp.SendTimeout = new TimeSpan(0, 30, 0);
                Mytcp.ReceiveTimeout = new TimeSpan(0, 30, 0);

                EndpointAddress Myaddress = new EndpointAddress(AddressStr);

                ChannelFactory<IMyContract> MyChannel = new ChannelFactory<IMyContract>(Mytcp, Myaddress);

                Mycontract = MyChannel.CreateChannel();
            }
            private void button4_Click(object sender, RoutedEventArgs e)
            {
                //System.Windows.Forms.FileDialog folderdialog;
                if (textBox5.Text == "")
                {
                    MessageBox.Show("服务器地址不能为空!");
                }
                else
                {
                    //if (folderdialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    //{
                        //获取文件目录
                        //string imagePath = folderdialog.FileName;
                        //textBox4.Text =  textBox4.Text+ imagePath;
                        if (Mycontract.ClientToServerFile(textBox4.Text, textBox5.Text))
                            MessageBox.Show("上传成功!");
                        else
                            MessageBox.Show("上传失败!");
                    //}
                }
               
            }

    这是完整的代码:本地测试能传输,远程的话,就会报服务器内部错误!是怎么回事啊?而且我用这种方式传递参数都没有问题!是不是流操作有问题啊?

    请帮忙看下?

    2012年5月10日 1:29

答案

  • 有没有抛出什么具体的错误? 看你上面的代码好像没有问题,你试着增大sendTimeout与maxReceivedMessage的值看下。客户端机器可以连接到远程服务器吗?你试下关闭防火墙,如果URL地址中指定了端口号的话,看下服务器端口有没有打开或是被其它的应用程序占用了。我觉得你可以采用WCF REST服务方式来上传或下载文件。你可以在服务端启用WCF tracing来查看是什么原因引发该错误。

    #enable WCF tracing.

    http://blogs.msdn.com/b/madhuponduru/archive/2006/05/18/601458.aspx


    Please mark the replies as answers if they help or unmark if not. If you have any feedback about my replies, please contact msdnmg@microsoft.com Microsoft One Code Framework

    2012年5月13日 2:56
    版主