繁体   English   中英

如何将.NetFramework 中的MessageHandler 转换为AspNet.Core

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM