Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将.NetFramework中的MessageHandler转换为AspNet.Core_C#_Asp.net Core_Asp.net Core Webapi - Fatal编程技术网

C# 如何将.NetFramework中的MessageHandler转换为AspNet.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

我有下面的消息处理程序返回一些自定义消息,我正在.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;
        }
    }
.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>();
}