【问题标题】:Trouble grasping the Async Pattern using WCF使用 WCF 无法掌握异步模式
【发布时间】:2013-10-20 19:45:18
【问题描述】:

我正在开发一个 WCF 服务,在该服务上,服务器能够对来自文件的特定字节的客户端请求进行异步调用。

回调合约:

public interface IControlChannelCallback
    {
        [...]

        [OperationContract(AsyncPattern = true)]
        IAsyncResult BeginGetRemoteFile(string filename, byte[] buffer, int position, int count, AsyncCallback callback, object state);

        int EndGetRemoteFile(IAsyncResult ar);
    }

实施:

public IAsyncResult BeginGetRemoteFile(string filename, byte[] buffer, int position, int count, AsyncCallback callback,
            object state)
        {
            var task = Task<int>.Factory.StartNew(x =>
            {
                using (var fileStream = new FileStream(filename, FileMode.Open))
                {
                    fileStream.Position = position;

                    return fileStream.Read(buffer, 0, count);
                }
            }, state);

            return task.ContinueWith(x => callback(task));
        }

        public int EndGetRemoteFile(IAsyncResult ar)
        {
            var task = (Task<int>) ar;

            return task.Result;
        }

状态对象:

public class ServiceStreamReaderStateObject
    {
        public const int BufferSize = 1024;

        public byte[] Buffer { get; private set; }

        public int TotalRead { get; set; }

        public ServiceStreamReaderStateObject()
        {
            Buffer = new byte[BufferSize];
        }
    }

服务使用情况:

private void Download()
{
    var state = new ServiceStreamReaderStateObject();

    _client.Callback.BeginGetRemoteFile(@"F:\1313363989488.jpg", state.Buffer, 0,      state.Buffer.Length, RealCallback, state);
}

private void RealCallback(IAsyncResult ar)
        {
            var state = (ServiceStreamReaderStateObject) ar.AsyncState;

            var totalRead = _client.Callback.EndGetRemoteFile(ar);
        }

似乎一切正常,当我调用EndGetRemoteFile 方法时,它返回1024,这是应该读取多少字节,但问题是封装在状态对象ServiceStreamReaderStateObject 上的缓冲区为空(已满零)。

我不明白我做错了什么,按照我的逻辑缓冲区应该充满数据,我在这里做错了什么?

【问题讨论】:

    标签: c# .net wcf asynchronous file-transfer


    【解决方案1】:

    只是预感:你能去掉“ServiceStreamReaderStateObject”的Buffer属性上的“private”访问修饰符吗

    public class ServiceStreamReaderStateObject
    {
        public const int BufferSize = 1024;
    
        public byte[] Buffer { get; set; }
    
        public int TotalRead { get; set; }
    
        public ServiceStreamReaderStateObject()
        {
            Buffer = new byte[BufferSize];
        }
    

    【讨论】:

    • 您能否详细说明为什么需要 position 和 count 作为参数?您是否尝试分块流式传输文件?
    • 是的,我希望能够以块的形式获取文件,所以我不会遇到内存使用过多的问题。
    • 知道了。检查此解决方案:stackoverflow.com/questions/14479885/…
    • 非常有趣的是,WCF 已经支持我尝试用最少的代码做的事情,但现在的问题是我找不到支持双工和流传输的绑定。
    • 如果您不限于 HTTP,如果您需要,NetTCP 绑定支持全双工通信。此外,如果您的服务和客户端都在防火墙后面,“WSDualHttpBinding”也可能是一个选项。 msdn.microsoft.com/en-us/library/…
    猜你喜欢
    • 2016-06-17
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 2018-04-25
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    相关资源
    最近更新 更多