我需要一个关于WCF流式文件传输的好例子.
我找到了几个并尝试了它们,但帖子很旧,我在.net 4和IIS 7上玩耍,所以有一些问题.
你能给我一个好的和最新的例子吗?
在我的申请中,这是一个严重的问题,几个月没有找到任何好的解决方案.我注意到C#管理Stream类在WCF中流式传输的方式,而不考虑我的配置.
首先,我有一个继承自FileStream的类,因此我可以随时观察从客户端读取的内容:
public class FileStreamWatching : FileStream
{
/// <summary>
/// how much was read until now
/// </summary>
public long _ReadUntilNow { get; private set; }
public FileStreamWatching(string Path, FileMode FileMode, FileAccess FileAccess)
: base(Path, FileMode, FileAccess)
{
this._ReadUntilNow = 0;
}
public override int Read(byte[] array, int offset, int count)
{
int ReturnV = base.Read(array, offset, count);
//int ReturnV = base.Read(array, offset, count);
if (ReturnV > 0)
{
_ReadUntilNow += ReturnV;
Console.WriteLine("Arr Lenght: " + array.Length);
Console.WriteLine("Read: " …Run Code Online (Sandbox Code Playgroud) 我正在尝试将MessageContract添加到我的WCF服务,类似于此问题中的内容:WCF:使用流式传输与消息合同
这是我得到的异常: 无法加载操作"UploadFile",因为它具有System.ServiceModel.Channels.Message类型的参数或返回类型,或具有MessageContractAttribute的类型和不同类型的其他参数.使用System.ServiceModel.Channels.Message或使用MessageContractAttribute类型时,该方法不得使用任何其他类型的参数.
这是我的合同:
[ServiceContract]
public interface IFile
{
[OperationContract]
bool UploadFile(FileUpload upload);
}
[MessageContract]
public class FileUpload
{
[MessageHeader(MustUnderstand = true)]
public int Username { get; set; }
[MessageHeader(MustUnderstand = true)]
public string Filename { get; set; }
[MessageBodyMember(Order = 1)]
public Stream ByteStream { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是我在app.config中使用的绑定配置:
<netTcpBinding>
<binding name="TCPConfiguration" maxReceivedMessageSize="67108864" transferMode="Streamed">
<security mode="None" />
</binding>
</netTcpBinding>
Run Code Online (Sandbox Code Playgroud)
现在我想这可能与我正在使用的绑定类型有关,但我不完全确定.
我正在使用流式传输模式的WCF绑定,用于向服务上载和从服务下载二进制内容.我设法让它运作起来.我将包括配置,合同等以供参考.
我做了一些测试来测试不同的绑定和编码.上传结果似乎没问题.NetTcp是最快的,其次是BasicHttp-MTOM,然后是BasicHttp-Text.让我感到惊讶的是,在下载大文件时,与使用BasicHttp的文本编码和使用NetTcp的二进制编码相比,MTOM非常慢.
我错过了什么吗?为什么在上传时BasicHttp-MTOM的工作速度比其他绑定慢?除此之外,我还为下载实现了双缓冲.除了带有MTOM编码的BasicHttp之外,这也适用于所有绑定.为什么使用MTOM时双缓冲无效?
感谢您的阅读,您对此的建议和想法.
检测结果:
将150 MB二进制数据上载到服务.客户端从150 MB文件创建文件流并传递给服务器.服务器将流读入内存流.还没有双重缓冲.由于没有向文件系统写入数据,因此结果似乎很快.并且绑定按预期执行.

从服务下载100 MB二进制数据.服务创建内存流并传递给客户端.客户端写入文件系统.以下是单缓冲区和双缓冲区的结果.正如您所看到的,MTOM似乎非常慢,并且也不响应双缓冲.

服务器配置(为简单起见省略了一些部分):
<configuration>
<system.web>
<httpRuntime maxRequestLength="2147483647"/>
</system.web>
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="StreamedNetTcpBinding"
transferMode="Streamed"
maxReceivedMessageSize="1099511627776">
</binding>
</netTcpBinding>
<basicHttpBinding>
<binding name="StreamedBasicHttpBindingWithMtom"
messageEncoding="Mtom" transferMode="Streamed"
maxReceivedMessageSize="1099511627776">
</binding>
<binding name="StreamedBasicHttpBinding"
transferMode="Streamed"
maxReceivedMessageSize="1099511627776">
</binding>
</basicHttpBinding>
</bindings>
</system.serviceModel>
</configuration>
Run Code Online (Sandbox Code Playgroud)
客户端配置(为简单起见省略了一些部分):
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="StreamedBasicHttpBindingWithMtom"
maxReceivedMessageSize="1099511627776"
messageEncoding="Mtom" transferMode="Streamed">
</binding>
<binding name="StreamedBasicHttpBinding"
maxReceivedMessageSize="1099511627776"
transferMode="Streamed">
</binding>
</basicHttpBinding>
<netTcpBinding>
<binding name="StreamedNetTcpBinding" transferMode="Streamed"
maxReceivedMessageSize="1099511627776">
</binding>
</netTcpBinding>
</bindings>
</system.serviceModel>
</configuration>
Run Code Online (Sandbox Code Playgroud)
服务合约:
[ServiceContract]
public interface IFileService
{
[OperationContract]
void UploadFile(DocumentData document);
[OperationContract]
DocumentData …Run Code Online (Sandbox Code Playgroud) 我使用netTcpBinding和streaming将文件从一个服务器发送到另一个服务器,就像我在这个代码项目文章中所描述的那样,据我所知在wcf中我们想要发送流我们应该创建并将其作为消息契约返回,问题是如何获得完成文件发送?因为我想在文件发送保证完成时将文件从收件箱移动到发件箱
我花了一天的大部分时间试图弄清楚为什么这不起作用。我有一个 WCF 服务,它将对象流式传输到客户端。然后客户端应该将文件写入其磁盘。但是当我调用stream.Read(buffer, 0, bufferLength)它时总是返回 0。这是我的代码:
namespace StreamServiceNS
{
[ServiceContract]
public interface IStreamService
{
[OperationContract]
Stream downloadStreamFile();
}
}
class StreamService : IStreamService
{
public Stream downloadStreamFile()
{
ISSSteamFile sFile = getStreamFile();
BinaryFormatter bf = new BinaryFormatter();
MemoryStream stream = new MemoryStream();
bf.Serialize(stream, sFile);
return stream;
}
}
Run Code Online (Sandbox Code Playgroud)
服务配置文件:
<system.serviceModel>
<services>
<service name="StreamServiceNS.StreamService">
<endpoint address="stream" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IStreamService"
name="BasicHttpEndpoint_IStreamService" contract="SWUpdaterService.ISWUService" />
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IStreamService" transferMode="StreamedResponse"
maxReceivedMessageSize="209715200"></binding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceThrottling maxConcurrentCalls ="100" maxConcurrentSessions="400"/>
<serviceMetadata …Run Code Online (Sandbox Code Playgroud)