使用流消息 (Mtom) 在 WCF 服务的流字段中检测 EndOfStream
Detect EndOfStream in a stream field on a WCF service using streaming messages (Mtom)
我的网络方法接收一个简单的结构,其中一个字段是一个流。
它是这样的:
[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 中获取该信息的一些简单方法。
我试图避免在文件末尾发送标记。
您尝试过使用最简单的解决方案吗?
file.stream.CopyTo(fs);
我的网络方法接收一个简单的结构,其中一个字段是一个流。 它是这样的:
[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 中获取该信息的一些简单方法。
我试图避免在文件末尾发送标记。
您尝试过使用最简单的解决方案吗?
file.stream.CopyTo(fs);