Как стать автором
Обновить

Комментарии 20

Мидлвары бесполезны как концепция, сужу по опыту Node.js и express. Т.к. для разных роутов нужна своя комбинация мидлвар, через которые будет проходить запрос, плюс в чем именно роль middleware? Добавлять к объекту запроса дополнительные методы, модифицировать данные внутри объекта запроса и т.д.? с этим на мой взгляд лучше справляется Dependency Injection и инъекция сервисов в обработчики вместо самого объекта запроса.
И в чем проблема указать для разных зон сайта разные middleware? Кстати, Autofac.Owin тоже через Middleware работает.
Для пре- и постпроцессинга крайне полезны. Обработку всяких X-HTTP-Request-Override и разного хлама от reverse-proxy (X-Forwarded-From, X-Scheme и т. п.) оптимально закинуть в них. Логгинг ошибок — в них. Аутентификацию запросов — тоже в них.
Нужно для:
— аутентификации
— логгирования
— преобразования риквеста/респонса (что в этом примере и есть)
в express становится удобной работа с сессиями пользователя, где за операции различного рода отвечают разные middleware.
  • лог
  • таргетинг, например гео
  • наложение своих заголовков поверх статики, например Cache-Control
  • отдача статики

очень много возможностей контроля над запросами появляется
Путь через компоненты


Думаю pass through components — это всё же «сквозные» компоненты)
Согласен. Сначала написал «промежуточные компоненты», не понравилось. Потому попробовал перефразировать в путь… тоже не то. Сквозные, наверное, будет лучшим вариантом.
Сквозные компоненты, которые образуют конвейер между сервером и приложением, которое выполняет инспекцию, маршрутизацию или изменении запроса и ответа с определенной целью.

Здесь скорее: «Сквозные компоненты, которые образуют конвейер между сервером и приложением и выполняющие инспекцию, маршрутизацию или изменении запроса и ответа с определенной целью.»
Один вопрос вы записываете footer после тега html? По тексту функции я не вижу где вы парсите выходной html, что бы внедрить footer в правильное место. Или я что то не понимаю?

Вот тут:


responseBody = responseBody.Replace("<footer>",

То есть в исходной разметке ищется подстрока <footer>, которая дальше заменяется на сгенерированную.

Хитро :). И еще вопрос я все сделал как у вас и мне в мидлвар обработчик приходит запрос favicon.ico и я не знаю что с ним делать ))). В HTTP модуле я просто не вызывал app.CompleteRequest(); И тогда IIS отдавал этот файл… Раз уж пошла такая пьянка, хочу спросить еще один вопрос, что если я полностью выключу MVC платформу не начнет плющить?

Чтобы передать запрос дальше, надо вызвать await _next(context);, если речь идет об асинхронном методе. Или return _next(context), если речь идет о синхронном.

            if (context.Request.Path == "favicon.ico")
            {
                return _next(context);
            }


Ругается…
Похоже что подводных камней в Core не мало. При попытке прочитать context.Request.Path я получаю исключение:
System.ArgumentException: The path in 'value' must start with '/'.

там был «index.html» не понимаю по какой причине путь должен начинаться с '/' и как заставить браузер его посылать )), бред какой то.

И когда уже программисты научатся к сообщениям об ошибках прикладывать стектрейсы?..

Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request starting HTTP/1.1 DEBUG http://localhost:57252/  0
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request starting HTTP/1.1 GET http://localhost:57252/index.html?action=test  
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request finished in 17084.406ms 200 
Microsoft.AspNetCore.Server.Kestrel:Error: Connection id "0HKVOC28KEBCG": An unhandled exception was thrown by the application.

System.ArgumentException: The path in 'value' must start with '/'.
Parameter name: value
   at Microsoft.AspNetCore.Http.PathString..ctor(String value)
   at Microsoft.AspNetCore.Http.PathString.op_Implicit(String s)
   at WebApplication1.MyMiddleware.<Invoke>d__2.MoveNext() in C:\Users\Макс\Documents\Visual Studio 2015\Projects\WebApplication1\src\WebApplication1\MyMiddleware.cs:line 23
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Server.IISIntegration.IISMiddleware.<Invoke>d__8.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Hosting.Internal.RequestServicesContainerMiddleware.<Invoke>d__3.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Server.Kestrel.Internal.Http.Frame`1.<RequestProcessingAsync>d__2.MoveNext()
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request finished in 39294.2338ms 200 


using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;

namespace WebApplication1
{
    public class MyMiddleware
    {
        RequestDelegate _next;

        public MyMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task Invoke(HttpContext context)
        {
            var act = context.Request.Query["action"];

            if (context.Request.Path == "favicon.ico")//Здесь исключение
            {
                return;// _next(context);
            }

            var wr = new StreamWriter(context.Response.Body);

            var str = ("<html><body>" + wr + "</body></html>").ToCharArray();

            wr.Write(str);
        }
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;

namespace WebApplication1
{
    public class Startup
    {
        public Startup(IHostingEnvironment env)
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                .AddEnvironmentVariables();
            Configuration = builder.Build();
        }

        public IConfigurationRoot Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            // Add framework services.
            //services.AddMvc();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            loggerFactory.AddConsole(Configuration.GetSection("Logging"));
            loggerFactory.AddDebug();

            //app.UseMvc();
            //app.UseStaticFiles();

            app.UseMiddleware<MyMiddleware>();
        }
    }
}



Скриншот в отладке и настроек

http://prntscr.com/cwf48q
http://prntscr.com/cwf3p4

В следующий раз не забывайте спойлеры ставить.


И читайте описание ошибок внимательнее! У вас ошибка не при чтении Path — а при преобразовании строкового литерала в PathString.

Тут ошибка не у меня, а ошибка где то в нутрях Core. Поскольку это не я присваивал Path это значение. Да и вобще получить исключение при чтении свойства это нонсенс. Я так понимаю это еще бетта версии? И в продакшене это еще нельзя использовать?

Простите, но вы читать умеете?


У вас ошибка не при чтении Path — а при преобразовании строкового литерала в PathString.

У вас ошибка не при чтении Path — а при преобразовании строкового литерала в PathString.

Что еще непонятно?

Тфьфу блин :)). Пора идти спать :)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации