2

我有一些带有流式 webHttpBinding 的测试 WCF 服务,它允许通过 Web 浏览器下载文件。问题是浏览器不显示文件大小和下载进度。这是服务合同:

[ServiceContract]
public interface IDataTransferService
{
    [WebGet(UriTemplate = "download?file={fileName}")]
    Stream GetDownloadStream(string fileName);
}

这是服务实现:

public sealed class DataTransferService : IDataTransferService
{
    public Stream GetDownloadStream(string fileName)
    {
        var context = WebOperationContext.Current;
        var stream = File.OpenRead(fileName);
        WebOperationContext.Current.OutgoingResponse.Headers["Content-Disposition"] = $"attachment; filename={Path.GetFileName(fileName)}";
        WebOperationContext.Current.OutgoingResponse.ContentType = "application/octet-stream";
        WebOperationContext.Current.OutgoingResponse.Headers["Content-Length"] = stream.Length.ToString();
        return stream;
    }
}

这是服务配置:

  <system.serviceModel>
    <services>
      <service name="WcfStreamingTest.Server.DataTransferService">
        <endpoint contract="WcfStreamingTest.IDataTransferService"
                  address="http://localhost:8000/streamingtest/api/transfer"
                  binding="webHttpBinding"
                  bindingConfiguration="streamedWeb"
                  behaviorConfiguration="web"/>
      </service>
    </services>
    <bindings>
      <webHttpBinding>
        <binding name="streamedWeb" transferMode="Streamed" sendTimeout="00:15:00" />
      </webHttpBinding>
    </bindings>    
    <behaviors>
      <endpointBehaviors>
        <behavior name="web">
          <webHttp />
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>

文件名正确显示,但缺少有关文件大小的信息。

4

1 回答 1

0

尝试将 transferMode 更改为 StreamedResponse

<binding name="streamedWeb" transferMode="StreamedResponse" sendTimeout="00:15:00" />
于 2018-10-18T10:44:24.010 回答