标签: wcf-streaming

WCF流式文件传输在.NET 4上

我需要一个关于WCF流式文件传输的好例子.

我找到了几个并尝试了它们,但帖子很旧,我在.net 4和IIS 7上玩耍,所以有一些问题.

你能给我一个好的和最新的例子吗?

.net c# asp.net wcf wcf-streaming

7
推荐指数
1
解决办法
9315
查看次数

WCF流 - 限制速度

在我的申请中,这是一个严重的问题,几个月没有找到任何好的解决方案.我注意到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)

c# wcf wcf-streaming

7
推荐指数
1
解决办法
1144
查看次数

使用MessageContract会在启动时崩溃WCF服务

我正在尝试将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)

现在我想这可能与我正在使用的绑定类型有关,但我不完全确定.

c# wcf messagecontract wcf-streaming

6
推荐指数
1
解决办法
6459
查看次数

使用WCF和MTOM进行流式处理

我正在使用流式传输模式的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)

wcf mtom wcf-binding wcf-streaming

6
推荐指数
1
解决办法
1万
查看次数

如何在流式传输wcf结束后删除文件

我使用netTcpBinding和streaming将文件从一个服务器发送到另一个服务器,就像我在这个代码项目文章中所描述的那样,据我所知在wcf中我们想要发送流我们应该创建并将其作为消息契约返回,问题是如何获得完成文件发送?因为我想在文件发送保证完成时将文件从收件箱移动到发件箱

c# wcf wcf-streaming

5
推荐指数
1
解决办法
2117
查看次数

WCF Stream.Read 在客户端总是返回 0

我花了一天的大部分时间试图弄清楚为什么这不起作用。我有一个 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)

c# streaming wcf wcf-streaming

1
推荐指数
1
解决办法
4793
查看次数