none
关于WCF异步的问题 RRS feed

  • 问题

  •  [ServiceContract(Name = "FileReaderService", Namespace = "http://localhost/")]
        public interface IFileReader
        {
            [OperationContract(AsyncPattern = true)]
            IAsyncResult BeginRead(string fileName, AsyncCallback callBack, object stateObject);

            string EndRead(IAsyncResult asynResult);
        }

     public class FileReaderService : IFileReader
        {
            private const string baseLocation = @"E:\";
            private FileStream _stream = null;
            private byte[] _buffer = null;

            public IAsyncResult BeginRead(string fileName, AsyncCallback callBack, object stateObject)
            {
                _stream = new FileStream(baseLocation + fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
                _buffer = new byte[_stream.Length];
                return _stream.BeginRead(_buffer, 0, _buffer.Length, callBack, stateObject);
            }

            public string EndRead(IAsyncResult asynResult)
            {
                _stream.EndRead(asynResult);

                _stream.Close();

                return Encoding.Unicode.GetString(_buffer);
            }
        }

    public  class FileReaderClient : ClientBase<IFileReader> , IFileReader
        {

            public string Read(string fileName)
            {
                return base.Channel.Read(fileName);
            }
        }

        [ServiceContract(Namespace="http://localhost/FileReaderService",
            ConfigurationName="IService.IFileReader")]
        public interface IFileReader
        {
            [OperationContract(Action = "http://localhost/FileReaderService/Read")]
            string Read(string fileName);
        }

     static void Main(string[] args)
            {
                using (FileReaderClient client = new FileReaderClient ())
                {
                    Console.WriteLine("文件内容:{0}",client.Read("HelloWorld.txt"));
                }
            }

    最后当执行它 base.Channel.Read(fileName);的时候就抱错了。。。请问。为什么呢 ?

    2012年9月22日 11:47

答案

  •  你好 , 谢谢你, 我没有想到那么多.不过我已经成功实现了.代码如下 , 如果有好的建议和想法,请多多指点,帮扶.再次感谢

    namespace IService
    {
        [ServiceContract(Name = "FileReaderService", Namespace = "http://localhost/FileReaderService/")]
        public interface IFileReader
        {
            [OperationContract(AsyncPattern = true)]
            IAsyncResult BeginRead(string fileName, AsyncCallback callBack, object stateObject);

            string EndRead(IAsyncResult asynResult);
        }
    }

    namespace Service
    {
        public class FileReaderService : IFileReader
        {
            private const string baseLocation = @"E:\";
            private FileStream _stream = null;
            private byte[] _buffer = null;

            public IAsyncResult BeginRead(string fileName, AsyncCallback callBack, object stateObject)
            {
                _stream = new FileStream(baseLocation + fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
                _buffer = new byte[_stream.Length];
                return _stream.BeginRead(_buffer, 0, _buffer.Length, callBack, stateObject);
            }

            public string EndRead(IAsyncResult asynResult)
            {
                _stream.EndRead(asynResult);

                _stream.Close();

                return Encoding.Default.GetString(_buffer);
            }
        }
    }

    namespace Host
    {
        class Program
        {
            static void Main(string[] args)
            {
                ServiceHost host = new ServiceHost(typeof(FileReaderService));

                host.Opened += delegate
                {
                    Console.Out.WriteLine("服务已经开启成功..!");
                };

                host.Open();

                Console.In.ReadLine();
            }
        }
    }

    namespace Client
    {
        public class FileReaderClient : ClientBase<IFileReader>, IFileReader
        {
            public string Read(string fileName)
            {
                //EndpointAddress address = new EndpointAddress("net.tcp://localhost/FileReaderService");
                IFileReader reader = base.ChannelFactory.CreateChannel();
                string writeValue = reader.Read(fileName);
                return writeValue;
            }
        }

        [ServiceContract(Namespace = "http://localhost/FileReaderService/", Name = "FileReaderService")]
        public interface IFileReader
        {
            [OperationContract]
            string Read(string fileName);
        }
    }

    namespace Client
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (FileReaderClient client = new FileReaderClient ())
                {
                    Console.WriteLine("文件内容:{0}",client.Read("HelloWorld.txt"));
                }
                Console.In.ReadLine();
            }
        }
    }


    我自己认为,异步既然在服务端创建,就没有必要在客户重新实现了.

    2012年9月27日 13:43

全部回复

  • 你用“添加服务”的方式生成代理类,然后查看代理类的的编写方式。

    2012年9月24日 2:40
  • 报的什么错呢?错误消息
    2012年9月24日 5:58
  • 你好 , 我是想根据WCF的框架的理解手动写一个.
    2012年9月24日 12:48
  • 你好 , 错误就是无法与服务段的协定通信.
    2012年9月24日 12:49
  •  我不确定 服务端可以这样定义异步操作吗? 这样会不会存在超时的问题。另外异步操作会非主线程执行任务,如何返回当前的上下文来告诉执行结果呢?这种编码方式我不知道是不是存在问题。

    Frank Xu Lei--谦卑若愚,好学若饥
    [老徐的网站]:http://www.frankxulei.com/

    [老徐的博客]:http://54peixun.com/Author/frankxulei
    微软WCF中文技术论坛
    微软WCF英文技术论坛

    Windows Azure中文技术论坛

    2012年9月24日 13:16
    版主
  • 你好 , 我是想根据WCF的框架的理解手动写一个.

    public  class FileReaderClient : ClientBase<IFileReader> , IFileReader
        {

            public string Read(string fileName) {
                try {
                    IAsyncResult result = this.Channel.BeginRead(fileName, null, null);
                    return base.Channel.EndSendMessage(result);
                }
                catch {
                    base.Channel = null;
                    throw;
                }
            }

            public IAsyncResult BeginRead(string fileName, AsyncCallback callback, object asyncState) {
                try {
                    return base.Channel.BeginRead(fileName, callback, asyncState);
                }
                catch {
                    base.Channel = null;
                    throw;
                }
            }

            public string EndRead(IAsyncResult result) {
                try {
                    return base.Channel.EndRead(result);
                }
                catch {
                    base.Channel = null;
                    throw;
                }
            }
        }

        [ServiceContract(Namespace="http://localhost/FileReaderService",
            ConfigurationName="IService.IFileReader")]
        public interface IFileReader
        {

            string Read(string fileName);

             [OperationContract(AsyncPattern = true)]
            IAsyncResult BeginRead(string fileName, AsyncCallback callBack, object stateObject);

            string EndRead(IAsyncResult asynResult);         
        }

    2012年9月25日 1:36
  •  你好 , 谢谢你, 我没有想到那么多.不过我已经成功实现了.代码如下 , 如果有好的建议和想法,请多多指点,帮扶.再次感谢

    namespace IService
    {
        [ServiceContract(Name = "FileReaderService", Namespace = "http://localhost/FileReaderService/")]
        public interface IFileReader
        {
            [OperationContract(AsyncPattern = true)]
            IAsyncResult BeginRead(string fileName, AsyncCallback callBack, object stateObject);

            string EndRead(IAsyncResult asynResult);
        }
    }

    namespace Service
    {
        public class FileReaderService : IFileReader
        {
            private const string baseLocation = @"E:\";
            private FileStream _stream = null;
            private byte[] _buffer = null;

            public IAsyncResult BeginRead(string fileName, AsyncCallback callBack, object stateObject)
            {
                _stream = new FileStream(baseLocation + fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
                _buffer = new byte[_stream.Length];
                return _stream.BeginRead(_buffer, 0, _buffer.Length, callBack, stateObject);
            }

            public string EndRead(IAsyncResult asynResult)
            {
                _stream.EndRead(asynResult);

                _stream.Close();

                return Encoding.Default.GetString(_buffer);
            }
        }
    }

    namespace Host
    {
        class Program
        {
            static void Main(string[] args)
            {
                ServiceHost host = new ServiceHost(typeof(FileReaderService));

                host.Opened += delegate
                {
                    Console.Out.WriteLine("服务已经开启成功..!");
                };

                host.Open();

                Console.In.ReadLine();
            }
        }
    }

    namespace Client
    {
        public class FileReaderClient : ClientBase<IFileReader>, IFileReader
        {
            public string Read(string fileName)
            {
                //EndpointAddress address = new EndpointAddress("net.tcp://localhost/FileReaderService");
                IFileReader reader = base.ChannelFactory.CreateChannel();
                string writeValue = reader.Read(fileName);
                return writeValue;
            }
        }

        [ServiceContract(Namespace = "http://localhost/FileReaderService/", Name = "FileReaderService")]
        public interface IFileReader
        {
            [OperationContract]
            string Read(string fileName);
        }
    }

    namespace Client
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (FileReaderClient client = new FileReaderClient ())
                {
                    Console.WriteLine("文件内容:{0}",client.Read("HelloWorld.txt"));
                }
                Console.In.ReadLine();
            }
        }
    }


    我自己认为,异步既然在服务端创建,就没有必要在客户重新实现了.

    2012年9月27日 13:43
  •  你好 , 谢谢你, 我没有想到那么多.不过我已经成功实现了.代码如下 , 如果有好的建议和想法,请多多指点,帮扶.再次感谢

    namespace IService
    {
        [ServiceContract(Name = "FileReaderService", Namespace = "http://localhost/FileReaderService/")]
        public interface IFileReader
        {
            [OperationContract(AsyncPattern = true)]
            IAsyncResult BeginRead(string fileName, AsyncCallback callBack, object stateObject);

            string EndRead(IAsyncResult asynResult);
        }
    }

    namespace Service
    {
        public class FileReaderService : IFileReader
        {
            private const string baseLocation = @"E:\";
            private FileStream _stream = null;
            private byte[] _buffer = null;

            public IAsyncResult BeginRead(string fileName, AsyncCallback callBack, object stateObject)
            {
                _stream = new FileStream(baseLocation + fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
                _buffer = new byte[_stream.Length];
                return _stream.BeginRead(_buffer, 0, _buffer.Length, callBack, stateObject);
            }

            public string EndRead(IAsyncResult asynResult)
            {
                _stream.EndRead(asynResult);

                _stream.Close();

                return Encoding.Default.GetString(_buffer);
            }
        }
    }

    namespace Host
    {
        class Program
        {
            static void Main(string[] args)
            {
                ServiceHost host = new ServiceHost(typeof(FileReaderService));

                host.Opened += delegate
                {
                    Console.Out.WriteLine("服务已经开启成功..!");
                };

                host.Open();

                Console.In.ReadLine();
            }
        }
    }

    namespace Client
    {
        public class FileReaderClient : ClientBase<IFileReader>, IFileReader
        {
            public string Read(string fileName)
            {
                //EndpointAddress address = new EndpointAddress("net.tcp://localhost/FileReaderService");
                IFileReader reader = base.ChannelFactory.CreateChannel();
                string writeValue = reader.Read(fileName);
                return writeValue;
            }
        }

        [ServiceContract(Namespace = "http://localhost/FileReaderService/", Name = "FileReaderService")]
        public interface IFileReader
        {
            [OperationContract]
            string Read(string fileName);
        }
    }

    namespace Client
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (FileReaderClient client = new FileReaderClient ())
                {
                    Console.WriteLine("文件内容:{0}",client.Read("HelloWorld.txt"));
                }
                Console.In.ReadLine();
            }
        }
    }

    我自己认为,异步既然在服务端创建,就没有必要在客户重新实现了. 非常感谢您 , 您的代码,让我找对了方向.不过还是期望您的指导,我这么写,是否正确?符合规范吗?或者说,有没有歧义性?

    2012年9月27日 13:45