使用流消息检测WCF服务上的流字段中的EndOfStream(Mtom)

时间:2016-12-06 14:55:26

标签: c# wcf streaming

我的网络方法收到一个简单的结构,其中一个字段是一个流。 它是这样的:

[MessageContract]
public class MyFile:IDisposable
{
    Stream _stream;
    [MessageBodyMember]
    public Stream stream
    {
        get { return _stream; }
        set { _stream= value; }
    }

    String _Name;
    [MessageHeader]
    public String Name
    {
        get { return _Name; }
        set { _Name = value; }
    }
}
#region IDisposable Support
private bool disposedValue = false; // To detect redundant calls

protected virtual void Dispose(bool disposing)
{
    if (!disposedValue)
    {
        if (disposing)
        {
            // TODO: dispose managed state (managed objects).
            _File.Dispose();
        }

        // TODO: free unmanaged resources (unmanaged objects) and override a finalizer below.
        // TODO: set large fields to null.

        disposedValue = true;
    }
}
public void submitFile(MyFile file)
{
  using (var fs = File.Create(@"d:\temp\" + file + ".pdf"))
    {
        int len;
        byte[] buffer = new byte[1024];
        do
        {
            len = file.stream.Read(buffer,0,buffer.Length);
            fs.Write(buffer, 0, len);
        } while (len != 0);
    }
}

此代码导致客户端出错。当客户端仍然通过流发送数据时,客户端中止说服务器已关闭流。

问题是如何检测流的结束?

我知道可以暂停通信,或者服务器可以比客户端更快地处理,因此没有数据可读并不意味着客户端已发送所有数据。 Http post应该在末尾有一些标签告诉服务器请求结束,所以在WCF中应该是一些简单的方法来获取该信息。

在文件末尾发送标记是我想要避免的。

1 个答案:

答案 0 :(得分:1)

您是否尝试过使用最简单的解决方案?

          file.stream.CopyTo(fs);