【问题标题】:How to convert MessageHandler in .NetFramework to AspNet.Core如何将 .Net Framework 中的消息处理程序转换为 Asp Net.Core
【发布时间】:2021-05-15 09:42:23
【问题描述】:

我有下面的消息处理程序来返回一些自定义消息,并且我在 .NetFramework 的 WebAPIConfig.Register 方法中注册,但是我在使用 .Net Core 时遇到了问题,因为看起来在 .NET Core 中删除了消息处理程序,我转换它时遇到一些问题。

    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 Core 实现:

我有以下代码,但它在创建响应和返回它时出错。

        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;

请提出建议。

【问题讨论】:

  • 您已发布代码并要求我们为您移植。请自己做一些研究和努力。如果您遇到困难,请在此处提问。
  • 我对 Ian Kemp 进行了一些研究,这就是我了解 .NET Core 中的中间件的方式,我在实施时遇到了麻烦,您是否也希望我发布该代码。如果我们在 .NET 核心中有关于如何实现这一点的答案,那将非常有帮助,我在 stackoverflow 中没有找到关于如何做到这一点的答案。
  • 您应该首先阅读asp.net core 中的中间件。这是必需的并且应该完成,除非您不是开发人员,或者您只是不想成为asp.net core 的专业人士,或者更糟的是您只想完成任务一次 并且永远不想理解它。这对于同一团队中的许多其他专业人士来说是如此糟糕甚至不公平,他们不得不帮助那些不想追随最新技术而只想在截止日期前完成任务的人。这样的开发人员就像没有激情的机器人一样工作。我个人受到这类开发者的影响。
  • @KingKing 你看到我现在有什么了吗?我确实读过它,如果我在解决某些问题并需要帮助时遇到问题,那有什么问题。你有什么建议可以解决吗?
  • 我不太确定如何在旧消息处理程序中使用该属性,看起来它是为了让下一个消息处理程序正确处理。仔细阅读你的旧消息处理程序,我认为当你有一个 404 的 response.StatusCode 但你创建另一个 HttpResponseMessage 来返回时有点奇怪 - 这听起来很奇怪。不知道这是什么逻辑,也许是某种response overriding?在您的情况下,将创建一个新响应来包装自定义消息。我认为没有像 HttpPropertyKeys.NoRouteMatched 这样的东西,所以你可以删除它。

标签: c# asp.net-core asp.net-core-webapi


【解决方案1】:

以下是实现(感谢@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>();
}

【讨论】:

    猜你喜欢
    • 2013-10-16
    • 1970-01-01
    • 2016-08-09
    • 2011-01-03
    • 2017-11-12
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    相关资源
    最近更新 更多