在web api中进行统一安全验证类DelegatingHandler ,

namespace System.Net.Http { // 摘要: // 被称为内部处理程序的并将 HTTP 响应消息委托给另一处理程序的 HTTP 处理程序的基类型。 public abstract class DelegatingHandler : HttpMessageHandler { // 摘要: // 创建 System.Net.Http.DelegatingHandler 类的新实例。 protected DelegatingHandler(); // // 摘要: // 创建特定内部处理程序的 System.Net.Http.DelegatingHandler 类的新实例。 // // 参数: // innerHandler: // 负责处理 HTTP 响应消息的内部处理程序。 protected DelegatingHandler(HttpMessageHandler innerHandler); // 摘要: // 获取或设置处理 HTTP 响应消息的内部处理程序。 // // 返回结果: // 返回 System.Net.Http.HttpMessageHandler。 HTTP 响应消息的内部处理程序。 public HttpMessageHandler InnerHandler { get; set; } // 摘要: // 释放由 System.Net.Http.DelegatingHandler 使用的非托管资源,并可根据需要释放托管资源。 // // 参数: // disposing: // 如果为 true,则释放托管资源和非托管资源;如果为 false,则仅释放非托管资源。 protected override void Dispose(bool disposing); // // 摘要: // 以异步操作发送 HTTP 请求到内部管理器以发送到服务器。 // // 参数: // request: // 要发送到服务器的 HTTP 请求消息。 // // cancellationToken: // 取消操作的取消标记。 // // 返回结果: // 返回 System.Threading.Tasks.Task<TResult>。 表示异步操作的任务对象。 // // 异常: // System.ArgumentNullException: // request 为 null。 protected internal override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken); } }

我们在此可以总结出,如ASP.NET Web API的消息处理管道均由DelegatingHandler组成(位于管道尾端的HttpMessageHandler除外),我们就可以根据其InnerHandler获得对被委托的HttpMessageHandler对象的引用,由此便构成消息处理的链式结构。组成ASP.NET Web API核心框架的消息处理管道,

理论总结的差不多,那么下面我们就对该消息处理委托类进行消息自定义操作,

public class RequestMessageDelegatingHandler : DelegatingHandler { protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { return base.SendAsync(request, cancellationToken).ContinueWith((responseToCompleteTask) => { //获取URL参数 NameValueCollection query = HttpUtility.ParseQueryString(request.RequestUri.Query); //获取Post正文数据,比如json文本 string fRequesContent = request.Content.ReadAsStringAsync().Result; //可以做一些其他安全验证工作,比如Token验证,签名验证。 //可以在需要时自定义HTTP响应消息 //return SendError("自定义的HTTP响应消息", HttpStatusCode.OK);  HttpResponseMessage response = responseToCompleteTask.Result; HttpError error = null; if (response.TryGetContentValue<HttpError>(out error)) { //添加自定义错误处理 //error.Message = "请求失败";  } if (error != null) { //记录关键的异常信息 QWPlatform.SystemLibrary.LogManager.Logger.Instance.Error("[" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "]404错误:请求数据" + error.Message); //返回错误信息 throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.OK) { //封装处理异常信息,返回指定JSON对象 Content = new StringContent(new ZLSoft.CHSS.Web.Public.Library.BaseClass.AjaxResult(Common.Base.AjaxResultType.失败, error.Message + "404").CreateResultString()), //Encoding.GetEncoding("UTF-8"), "application/json" ReasonPhrase = "Exception" }); } else { return response; } }, cancellationToken); } }

接下来,我们只需要把当前类注册到 webapiconfig类当中。

接下里就可以在 RequestMessageDelegatingHandler 中间写好消息处理机制哪里进行统一的安全校验。

原文链接:https://www.cnblogs.com/lwyu/p/10593727.html

原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/17598

(0)
上一篇 2022年12月21日
下一篇 2022年12月21日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

优速盾注册领取大礼包www.cdnb.net
/sitemap.xml