如何在 Asp.Net webAPI C# 中向管道添加自定义消息处理程序?


要创建 ASP.NET Web API 中的自定义服务器端 HTTP 消息处理程序,我们需要创建一个必须从System.Net.Http.DelegatingHandler派生的类。

步骤 1 -

创建一个控制器及其对应的操作方法。

示例

using DemoWebApplication.Models;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
namespace DemoWebApplication.Controllers{
   public class StudentController : ApiController{
      List<Student> students = new List<Student>{
         new Student{
            Id = 1,
            Name = "Mark"
         },
         new Student{
            Id = 2,
            Name = "John"
         }
      };
      public IEnumerable<Student> Get(){
         return students;
      }
      public Student Get(int id){
         var studentForId = students.FirstOrDefault(x => x.Id == id);
         return studentForId;
      }
   }
}

步骤 2 -

创建我们自己的 CutomerMessageHandler 类。

示例

using System.Net;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
namespace DemoWebApplication{
   public class CustomMessageHandler : DelegatingHandler{
      protected async override Task<HttpResponseMessage>
      SendAsync(HttpRequestMessage request, CancellationToken cancellationToken){
         var response = new HttpResponseMessage(HttpStatusCode.OK){
            Content = new StringContent("Result through custom message handler..")
         };
         var taskCompletionSource = new
         TaskCompletionSource<HttpResponseMessage>();
         taskCompletionSource.SetResult(response);
         return await taskCompletionSource.Task;
      }
   }
}

我们已声明从 DelegatingHandler 派生的 CustomMessageHandler 类,并在其中覆盖了 SendAsync() 函数。

当 HTTP 请求到达时,CustomMessageHandler 将执行,并且它将自行返回一个 HTTP 消息,而不会进一步处理 HTTP 请求。因此,最终我们阻止了每个 HTTP 请求到达其更高级别。

步骤 3 -

现在在 Global.asax 类中注册 CustomMessageHandler。

public class WebApiApplication : System.Web.HttpApplication{
   protected void Application_Start(){
      GlobalConfiguration.Configure(WebApiConfig.Register);
      GlobalConfiguration.Configuration.MessageHandlers.Add(new
      CustomMessageHandler());
   }
}

步骤 4 -

运行应用程序并提供 URL。

从以上输出中,我们可以看到我们在 CustomMessageHandler 类中设置的消息。因此,HTTP 消息没有到达 Get() 操作,并且在此之前它返回到我们的 CustomMessageHandler 类。

更新于:2020-09-24

526 次查看

启动你的 职业生涯

通过完成课程获得认证

开始学习
广告