Ошибка сети REST WCF при записи непосредственно в HttpResponse - PullRequest
0 голосов
/ 07 мая 2018

Я создаю веб-сервис WCF REST, который будет использоваться для загрузки больших файлов (потенциально более 2 ГБ). Эти файлы представляют собой CSV-файлы, которые не хранятся на жестком диске, а формируются во время выполнения при выполнении запроса. Из-за этого я решил записать CSV-файл непосредственно в HttpResponse, избегая любых промежуточных контейнеров, которые не будут содержать более 2 ГБ данных. Это тестовый код, который я написал, который делает то, что я описал:

[ServiceContract]
public interface IDownloadService
{
    [OperationContract]
    [WebInvoke(
        Method = "GET",
        RequestFormat = WebMessageFormat.Json,
        ResponseFormat = WebMessageFormat.Json,
        UriTemplate = "")]
    void Download();
}

public class DownloadService : IDownloadService
{
    public void Download()
    {
        var response = HttpContext.Current.Response;
        response.Clear();
        response.ContentType = "application/csv";
        response.AddHeader("Content-Disposition", "attachment; filename=myfile.csv");

        //This is a small test csv file, it will be replaced with a big file,
        //that will be formed in runtime and written piece by piece into Response.OutputStream
        response.BinaryWrite(System.Text.Encoding.UTF8.GetBytes("1,2,3"));
        response.Flush();
        response.Close();
        response.End();
    }
}

Это мой Web.config, на всякий случай:

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.6.1" />
    <httpRuntime targetFramework="4.6.1"/>
  </system.web>
  <system.serviceModel>
    <behaviors>
      <endpointBehaviors>
        <behavior name="web">
          <webHttp />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <services>
      <service name="RestWcf.DownloadService">
        <endpoint address="" binding="webHttpBinding" behaviorConfiguration="web" contract="RestWcf.IDownloadService"/>
      </service>
    </services>   
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
</configuration>

Теперь вот интересная часть, когда я вызываю этот метод веб-сервиса из Google Chrome, сначала он начинает загрузку файла, а в конце загрузки Chrome выдает ошибку Failed - Network error, когда я пытаюсь вызвать его из Postman Я получаю Could not get any response сообщение без сгенерированного ответа, наконец, когда я пытаюсь вызвать его с Fiddler Я получаю 504 ответ с более информативным сообщением ReadResponse() failed: The server did not return a complete response for this request. Server returned 384 bytes.

Любые идеи о том, что здесь происходит и как я могу исправить это странное поведение?

...