我有一些带有流式 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>
文件名正确显示,但缺少有关文件大小的信息。