Комментарии 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 я получаю исключение:
там был «index.html» не понимаю по какой причине путь должен начинаться с '/' и как заставить браузер его посылать )), бред какой то.
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 это значение. Да и вобще получить исключение при чтении свойства это нонсенс. Я так понимаю это еще бетта версии? И в продакшене это еще нельзя использовать?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
ASP.NET 5 Middleware или куда же пропал мой HTTP модуль?