我的网络方法收到一个简单的结构,其中一个字段是一个流。 它是这样的:
[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中应该是一些简单的方法来获取该信息。
在文件末尾发送标记是我想要避免的。
答案 0 :(得分:1)
您是否尝试过使用最简单的解决方案?
file.stream.CopyTo(fs);