Я пытался использовать промежуточное ПО для изменения тела ответа файлов 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;