Поиск…


замечания

Middleware - программный компонент, который определит, как обрабатывать запрос, и решить, передавать ли его следующему компоненту в конвейере приложения. Каждое промежуточное программное обеспечение имеет различную конкретную роль и действия для преформы по запросу.

Использование промежуточного программного обеспечения ExceptionHandler для отправки пользовательской ошибки JSON для клиента

Определите свой класс, который будет представлять вашу пользовательскую ошибку.

public class ErrorDto
{
   public int Code { get; set; }
   public string Message { get; set; }

   // other fields

   public override string ToString()
   {
      return JsonConvert.SerializeObject(this);
   }
}

Затем добавьте следующее промежуточное ПО ExceptionHandler в метод Configure. Обратите внимание, что порядок промежуточного слоя важен.

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);
            }
        });
    });

Среднее ПО для установки ответа ContentType

Идея заключается в использовании HttpContext.Response.OnStarting обратного вызова, поскольку это последнее событие, которое запускается до отправки заголовков. Добавьте следующее к методу Invoke промежуточного ПО.

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);
}

Передача данных через цепочку промежуточного программного обеспечения

Из документации :

Коллекция HttpContext.Items - лучшее место для хранения данных, которое требуется только при обработке данного запроса. Его содержимое отбрасывается после каждого запроса. Он лучше всего используется в качестве средства связи между компонентами или промежуточным программным обеспечением, которые работают в разные моменты времени во время запроса, и не имеют прямого отношения друг к другу, чтобы передавать параметры или возвращать значения.

HttpContext.Items - это простая коллекция словарей типа IDictionary<object, object> . Эта коллекция

  • доступный с начала HttpRequest
  • и отбрасывается в конце каждого запроса.

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

Например, некоторые простые Middleware могут добавить что-то в коллекцию Items:

app.Use(async (context, next) =>
{
    // perform some verification
    context.Items["isVerified"] = true;
    await next.Invoke();
});

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

app.Run(async (context) =>
{
    await context.Response.WriteAsync("Verified request? " + context.Items["isVerified"]);
});

Запуск, карта, использование

Бежать

Завершает цепочку. После этого никакой другой метод промежуточного слоя не будет запущен. Должен быть помещен в конец любого трубопровода.

app.Run(async context =>
{
    await context.Response.WriteAsync("Hello from " + _environment);
});

использование

Выполняет действия до и после следующего делегата.

app.Use(async (context, next) =>
{
    //action before next delegate
    await next.Invoke(); //call next middleware
    //action after called middleware
});

Иллюстрации о том, как это работает: введите описание изображения здесь

MapWhen

Включает ветвящийся конвейер. Запускает указанное промежуточное ПО, если условие выполнено.

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);
}

карта

Аналогично MapWhen. Запускает промежуточное программное обеспечение, если путь, запрошенный пользователем, равен пути, указанному в параметре.

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);

}

Основываясь на основных документах ASP.net



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow