Не удается получить размер файла при загрузке с хоста службы WCF через веб-браузер

У меня есть тестовый сервис WCF с потоковым webHttpBinding, который позволяет загружать файлы через веб-браузер. Проблема в том, что браузер не показывает размер файла и прогресс загрузки. Это сервисный контракт:

[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>

Имя файла отображается правильно, но информация о размере файла отсутствует.

1 ответ

Попробуйте изменить TransferMode на StreamedResponse

<binding name="streamedWeb" transferMode="StreamedResponse" sendTimeout="00:15:00" />
Другие вопросы по тегам