首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >已流式传输的webHttpBinding未流式传输

已流式传输的webHttpBinding未流式传输
EN

Stack Overflow用户
提问于 2011-06-20 17:24:43
回答 1查看 2.4K关注 0票数 2

我需要创建WCF REST服务上传大文件。我将终结点设置为streamed,但它尚未成为streamed。

服务示例:

代码语言:javascript
复制
[ServiceContract]
public interface IFiles
{
    [OperationContract]
    void UploadFile(Stream stream);
}

public class Files : IFiles
{
    public void UploadFile(Stream stream)
    {
        const int BUFFER_SIZE = 64 * 1024;
        byte[] buffer = new byte[BUFFER_SIZE];

        using (TextWriter logWriter = new StreamWriter("d:\\UploadedFile.log"))
        using (Stream fileStream = new FileStream("d:\\UploadedFile", System.IO.FileMode.Create, System.IO.FileAccess.Write))
        {
            int readBytes = 0;
            while (0 < (readBytes = stream.Read(buffer, 0, BUFFER_SIZE)))
            {
                fileStream.Write(buffer, 0, readBytes);
                logWriter.WriteLine("{0}: {1} bytes saved", DateTime.Now, readBytes);
            }
        }
    }
}

Web.config:

代码语言:javascript
复制
<?xml version="1.0"?>
<configuration>

  <system.serviceModel>
    <bindings>
      <webHttpBinding>
        <binding name="WebHttpBinding" maxBufferSize="65536" maxBufferPoolSize="524288"
          maxReceivedMessageSize="1073741824" transferMode="Streamed" />
      </webHttpBinding>
    </bindings>
    <services>
      <service name="WcfService2.Files">
        <endpoint behaviorConfiguration="WebHttpBehavior" binding="webHttpBinding"
          bindingConfiguration="WebHttpBinding" name="Files" contract="WcfService2.IFiles" />
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="WebHttpBehavior">
          <webHttp />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="MyServiceBehavior">
          <serviceMetadata />
          <serviceDebug />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
  <system.web>
    <httpRuntime maxRequestLength="500000" />
  </system.web>

</configuration>

客户端代码:

代码语言:javascript
复制
using (Stream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlString);
    request.Method = "POST";
    request.ContentType = "application/octet-stream";
    //request.ContentLength = fileStream.Length;
    //request.AllowWriteStreamBuffering = false;
    request.SendChunked = true;
    Stream requestStream = request.GetRequestStream();

    const int BUFFER_SIZE = 32 * 1024;
    byte[] buffer = new byte[BUFFER_SIZE];
    int readBytes = 0;
    while (0 < (readBytes = fileStream.Read(buffer, 0, BUFFER_SIZE)))
    {
        requestStream.Write(buffer, 0, readBytes);
        Console.WriteLine("{0}: {1} bytes sent", DateTime.Now, readBytes);
        System.Threading.Thread.Sleep(200);
    }
    requestStream.Close();

    WebResponse response = request.GetResponse();
}

只有在调用requestStream.Close()之后,才会调用方法UploadFile的代码。为什么?

EN

回答 1

Stack Overflow用户

发布于 2011-11-02 02:32:16

如果你想把它分成几部分发送,你应该在while循环的requestStream.Write()后面添加一个刷新。

代码语言:javascript
复制
requestStream.Flush();

这是因为streams可能会缓存输出,直到第二次发送它。请参阅http://msdn.microsoft.com/en-us/library/system.io.stream.flush.aspx

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6409174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档