ERR_CONTENT_LENGTH_MISMATCH при изменении ответа промежуточного программного обеспечения в linux - PullRequest
0 голосов
/ 24 марта 2020

Я пытался использовать промежуточное ПО для изменения тела ответа файлов javascript. Код работает без проблем при запуске на IIS Express в Windows, однако существуют проблемы при запуске в Ubuntu linux.

  • Если я не установил Content-Length в длину измененного тела ответа я получаю ERR_CONTENT_LENGTH_MISMATCH в браузере Chrome.
  • Если я установлю Content-Length равной длине измененного тела ответа, запрос будет возвращаться клиенту вечно. При просмотре в Chrome инструментах разработчика появляется сообщение «ВНИМАНИЕ: запрос еще не завершен!»

Код работает хорошо при работе на IIS Express в Windows. Кто-нибудь знает, почему и как решить эту проблему?

Мой файл Startup.cs

app.UseWhen(context => context.Request.Path.Value.EndsWith(".js"),
            appBranch => appBranch.UseTranslator());

app.UseStaticFiles();

Промежуточное ПО Translator

//Replace the response body stream with a memory stream
MemoryStream alternativeResponseStream = new MemoryStream();
Stream originalResponseStream = context.Response.Body;
context.Response.Body = alternativeResponseStream;

//Invoke the next middleware to get the content of the js file
await _next(context);

string jsContent = string.Empty;
alternativeResponseStream.Seek(0, SeekOrigin.Begin);
StreamReader reader = new StreamReader(alternativeResponseStream);
jsContent = reader.ReadToEnd();
reader.Close();

//translate js content
string translatedContent = Translate(jsContent);
MemoryStream translatedStream = new MemoryStream();
StreamWriter writer = new StreamWriter(translatedStream);
writer.Write(translatedContent);
writer.Flush();

//swap back the original response stream
translatedStream.Seek(0, SeekOrigin.Begin);
await translatedStream.CopyToAsync(originalResponseStream);
context.Response.Body = originalResponseStream;

//set the Content length as after translation the response length might have changed
context.Response.Headers.ContentLength = translatedStream.Length; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...