AS PNET CORE Middleware странное исключение - PullRequest
0 голосов
/ 05 марта 2020

Я создал делегат промежуточного программного обеспечения в совершенно новом проекте блазор-сервера, чтобы преобразовать мои html ответы. См. Код ниже.


            app.Use(async (context, next) =>
            {
                var originalStream = context.Response.Body;// currently holds the original stream                    
                var newStream = new MemoryStream();
                context.Response.Body = newStream;

                await next(); 

                string contentType1 = context.Response.ContentType?.Split(';', StringSplitOptions.RemoveEmptyEntries)[0];
                string contentType2 = "text/html";

                if (contentType1 == "text/html") // EXCEPTION THROWN, SEE IMAGE 1
                //if (contentType2 == "text/html") // EXCEPTION NOT THROWN, SEE IMAGE 2
                {
                    newStream.Seek(0, SeekOrigin.Begin);
                    var originalContent = new StreamReader(newStream).ReadToEnd();
                    var updatedContent = originalContent.Replace("Hello", "HOLA");

                    context.Response.Body = originalStream;
                    await context.Response.WriteAsync(updatedContent);
                }
            });

Но когда я сравниваю строку, извлеченную из Response.ContentType, я получаю исключение (изображение 1). Но при сравнении другой строки с тем же значением я не получаю ее (изображение 2). В обоих случаях страница отображается с заменой. Любая помощь в этом?

Изображение 1 Image 1

Изображение 2 Image 2

1 Ответ

0 голосов
/ 06 марта 2020

На самом деле, Исключение возникает, когда тип содержимого ответа НЕ "text / html" (конечно, в других запросах)

Реальная причина в том, что я назначаю тело новый поток, но никогда не восстанавливать originalStream , что неверно.

Но даже присвоение его впоследствии не работает. Это окончательное решение, с которым мне удалось поработать, см. Комментарии и заявления IF.

            app.Use(async (context, next) =>
            {
                var originalStream = context.Response.Body;           
                var newStream = new MemoryStream();
                context.Response.Body = newStream;

                await next();
                string contentType = context.Response.ContentType?.Split(';', StringSplitOptions.RemoveEmptyEntries)[0];
                //if (contentType == "text/html") //THIS IF -at this level- is still throwing the exceptions for NO text/hteml content type.
                //{

                    newStream.Seek(0, SeekOrigin.Begin);
                    var originalContent = new StreamReader(newStream).ReadToEnd();

                    if (contentType == "text/html") //THIS IF at these level, makes the replacement if needed, but it does not avoid the "Streams operations"
                    {
                        originalContent = originalContent.Replace("Hello", "HOLA");
                    }

                    var memoryStreamModified = GenerateStreamFromString(originalContent);
                    await memoryStreamModified.CopyToAsync(originalStream).ConfigureAwait(false);
                //}
                context.Response.Body = originalStream;
            });
...