asp.net-core
Middleware
Szukaj…
Uwagi
Middleware to komponent oprogramowania, który określa sposób przetworzenia żądania i decyduje, czy przekazać go do następnego komponentu w potoku aplikacji. Każde oprogramowanie pośredniczące ma określoną rolę i działania, które należy wykonać na żądanie.
Korzystanie z oprogramowania pośredniego ExceptionHandler do wysyłania niestandardowego błędu JSON do klienta
Zdefiniuj swoją klasę, która będzie reprezentować błąd niestandardowy.
public class ErrorDto
{
public int Code { get; set; }
public string Message { get; set; }
// other fields
public override string ToString()
{
return JsonConvert.SerializeObject(this);
}
}
Następnie umieść następne oprogramowanie pośrednie ExceptionHandler w Konfiguruj metodę. Zwróć uwagę, że kolejność oprogramowania pośredniego jest ważna.
app.UseExceptionHandler(errorApp =>
{
errorApp.Run(async context =>
{
context.Response.StatusCode = 500; // or another Status
context.Response.ContentType = "application/json";
var error = context.Features.Get<IExceptionHandlerFeature>();
if (error != null)
{
var ex = error.Error;
await context.Response.WriteAsync(new ErrorDto()
{
Code = <your custom code based on Exception Type>,
Message = ex.Message // or your custom message
... // other custom data
}.ToString(), Encoding.UTF8);
}
});
});
Oprogramowanie pośrednie, aby ustawić odpowiedź ContentType
Chodzi o to, aby użyć wywołania zwrotnego HttpContext.Response.OnStarting
, ponieważ jest to ostatnie zdarzenie uruchamiane przed wysłaniem nagłówków. Dodaj następujące metody do metody Invoke
oprogramowania pośredniego.
public async Task Invoke(HttpContext context)
{
context.Response.OnStarting((state) =>
{
if (context.Response.StatusCode == (int)HttpStatusCode.OK)
{
if (context.Request.Path.Value.EndsWith(".map"))
{
context.Response.ContentType = "application/json";
}
}
return Task.FromResult(0);
}, null);
await nextMiddleware.Invoke(context);
}
Przekaż dane przez łańcuch oprogramowania pośredniego
Z dokumentacji :
Kolekcja HttpContext.Items to najlepsza lokalizacja do przechowywania danych potrzebnych tylko podczas przetwarzania danego żądania. Jego zawartość jest odrzucana po każdym żądaniu. Najlepiej jest wykorzystywany jako środek komunikacji między komponentami lub oprogramowaniem pośredniczącym, które działają w różnych momentach podczas żądania i nie mają ze sobą bezpośrednich relacji, przez które można przekazywać parametry lub zwracać wartości.
HttpContext.Items
to prosta kolekcja słowników typu IDictionary<object, object>
. Ta kolekcja jest
- dostępne od początku
HttpRequest
- i jest odrzucany na końcu każdego żądania.
Możesz uzyskać do niego dostęp, po prostu przypisując wartość do wpisanego klucza lub żądając wartości dla danego klucza.
Na przykład niektóre proste oprogramowanie pośrednie może dodać coś do kolekcji Items:
app.Use(async (context, next) =>
{
// perform some verification
context.Items["isVerified"] = true;
await next.Invoke();
});
a później w przygotowaniu może uzyskać dostęp do innego oprogramowania pośredniego:
app.Run(async (context) =>
{
await context.Response.WriteAsync("Verified request? " + context.Items["isVerified"]);
});
Uruchom, mapuj, używaj
Biegać
Kończy łańcuch. Po tym nie będzie działać żadna inna metoda oprogramowania pośredniego. Powinien być umieszczony na końcu każdego rurociągu.
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from " + _environment);
});
Posługiwać się
Wykonuje akcję przed kolejnym delegatem i po nim.
app.Use(async (context, next) =>
{
//action before next delegate
await next.Invoke(); //call next middleware
//action after called middleware
});
Ilustracja tego, jak to działa:
Mapa Kiedy
Umożliwia rozgałęzienie potoku. Uruchamia określone oprogramowanie pośrednie, jeśli warunek jest spełniony.
private static void HandleBranch(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Condition is fulfilled");
});
}
public void ConfigureMapWhen(IApplicationBuilder app)
{
app.MapWhen(context => {
return context.Request.Query.ContainsKey("somekey");
}, HandleBranch);
}
Mapa
Podobne do MapWhen. Uruchamia oprogramowanie pośrednie, jeśli ścieżka żądana przez użytkownika jest równa ścieżce podanej w parametrze.
private static void HandleMapTest(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Map Test Successful");
});
}
public void ConfigureMapping(IApplicationBuilder app)
{
app.Map("/maptest", HandleMapTest);
}
Na podstawie podstawowych dokumentów ASP.net