C# 如何将.NetFramework中的MessageHandler转换为AspNet.Core
我有下面的消息处理程序返回一些自定义消息,我正在.NetFramework中的WebAPIConfig.Register方法中注册,但是我在.Net Core中遇到了问题,因为它看起来像是在.Net Core中删除了消息处理程序,我在转换它时遇到了一些问题C# 如何将.NetFramework中的MessageHandler转换为AspNet.Core,c#,asp.net-core,asp.net-core-webapi,C#,Asp.net Core,Asp.net Core Webapi,我有下面的消息处理程序返回一些自定义消息,我正在.NetFramework中的WebAPIConfig.Register方法中注册,但是我在.Net Core中遇到了问题,因为它看起来像是在.Net Core中删除了消息处理程序,我在转换它时遇到了一些问题 public class WebApiCustomMessageHandler : DelegatingHandler { protected override async Task<HttpRespon
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;
}
}
.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): 并在p.C.注册
public void Configure(IApplicationBuilder app)
{
app.UseMiddleware<WebApiCustomMiddleware>();
}
public void配置(IApplicationBuilder应用程序)
{
app.UseMiddleware();
}
您已发布代码并要求我们为您移植。请做一些研究,并作出自己的努力。如果你被卡住了,那么在这里问一个问题。我对Ian Kemp做了一些研究,这就是我如何了解.NET Core中的中间件的原因。我在实现这一点上遇到了困难。你希望我也发布这段代码吗。如果我们能在.NET core中找到关于如何实现这一点的答案,那将非常有帮助。我在stackoverflow中没有找到关于如何实现这一点的答案。您应该首先在asp.NET core
中阅读中间件。这是必须的,也应该这样做,除非你不是一名开发人员,或者你不想成为asp.net核心的专业人士,或者更糟糕的是,你只想完成一次任务,永远不想理解它。这对同一团队中的许多其他专业人员来说是非常糟糕甚至不公平的,他们必须帮助那些不想跟随最新技术的其他人,只是试图在截止日期前完成任务。这些开发人员像机器人一样毫无激情地工作。我个人受到了这些开发者的影响。@KingKing你看到我现在拥有的了吗?我确实读过这篇文章,如果我在解决问题时遇到了问题,需要帮助,那有什么错呢。。我不仅仅是问怎么做,我在做这件事的时候有错误,我在考虑如何修复它。。你有什么建议来修复它吗?我不太确定这个属性在旧的消息处理程序中是如何使用的,看起来应该由下一个消息处理程序来正确处理。仔细阅读您的旧消息处理程序,我认为当您有404的响应时有点奇怪。StatusCode
,但随后您创建了另一个HttpResponseMessage
返回-听起来很奇怪。不确定它是哪种逻辑,可能是某种类型的响应覆盖了?在您的情况下,将创建一个新的响应来包装自定义消息。我认为没有类似于HttpPropertyKeys.NoRouteMatched的东西,所以您可以删除它。
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(...)
{}
}
}
public void Configure(IApplicationBuilder app)
{
app.UseMiddleware<WebApiCustomMiddleware>();
}