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: wprowadź opis zdjęcia tutaj

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



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow