[英]How to convert MessageHandler in .NetFramework to AspNet.Core
我有下面的消息处理程序来返回一些自定义消息,并且我正在.NetFramework 中的 WebAPIConfig.Register 方法中注册,但是我在使用.Net Core 时遇到了问题,因为看起来 .NET 核心中删除了消息处理程序,我遇到了一些问题转换它。
public class WebApiCustomMessageHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
HttpResponseMessage response = await base.SendAsync(request, cancellationToken);
if (response.StatusCode == HttpStatusCode.NotFound)
{
request.Properties.Remove(HttpPropertyKeys.NoRouteMatched);
var errorResponse = request.CreateResponse(response.StatusCode, "resource not found.");
return errorResponse;
}
return response;
}
}
在 WebAPIConfig.Register 方法中注册:
public static void Register(HttpConfiguration config)
{
config.MessageHandlers.Add(new WebApiCustomMessageHandler());
}
.NET 核心实现:
我有以下代码,但它在创建响应和返回它时出错。
public class WebApiCustomMiddleware
{
private readonly RequestDelegate _next;
public WebApiCustomMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
//process context.Request
await _next(context);
//process context.Response
if (context.Response.StatusCode == HttpStatusCode.NotFound)
{
context.Request.Properties.Remove(HttpPropertyKeys.NoRouteMatched);
var errorResponse = context.Request.CreateResponse(context.Response.StatusCode, "resource not found.");
return errorResponse;
}
return response;
}
}
如何在 .net 核心中间件中创建响应并返回它会给出错误,因为它没有 context.Request.Properties、context.Request.CreateResponse,以及返回类型是什么?
context.Request.Properties.Remove(HttpPropertyKeys.NoRouteMatched);
var errorResponse = context.Request.CreateResponse(context.Response.StatusCode, "resource not found.");
return errorResponse;
请建议。
以下是实现(感谢@King King):
public class WebApiCustomMiddleware
{
private readonly RequestDelegate _next;
public WebApiCustomMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
//process context.Request
//to do like validating api keys, request headers etc..
await _next(context);
//process context.Response
if (context.Response.StatusCode == (int)HttpStatusCode.NotFound)
{
context.Response.ContentType = "application/json";
await context.Response.WriteAsync(JsonConvert.SerializeObject(new
{
statusCode = 404,
message = "resource not found"
}));
}
else if(...)
{}
}
}
并在 statup.cs 中注册
public void Configure(IApplicationBuilder app)
{
app.UseMiddleware<WebApiCustomMiddleware>();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.