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