asp.net-core                
            Промежуточное
        
        
            
    Поиск…
замечания
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