Я создаю веб-сервис 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.
Любые идеи о том, что здесь происходит и как я могу исправить это странное поведение?