创建自定义委派处理程序

本文关键字:程序 处理 委派 自定义 创建 | 更新日期: 2023-09-27 17:49:21

我希望添加一个自定义委托处理程序到我的asp.net web api。这个处理程序的目的是检查请求的内容,并在它们继续在请求管道中运行之前验证它们是否符合某些条件……我还想在这个入口点注销请求。

然而,请求。在管道中传递的内容是一个system.web.http.webhost.httpcontrollerhandler.lazystreamcontent——在MSDN中查找这个类型并没有揭示如何反序列化或查看请求内容——当我尝试从流中读取内容时,我得到了一个空字符串。参见示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;
namespace Haxy.Pencilthis.Api.MVC.Handlers
{
    public class ContentValidationHandler : DelegatingHandler
    {
        private static log4net.ILog Log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
            CancellationToken cancellationToken)
        {
            Stream strea = new MemoryStream();
            request.Content.CopyToAsync(strea);
            StreamReader reader = new StreamReader(strea);
            String res = reader.ReadToEnd();
            Log.Info("request content: " + res);
            return base.SendAsync(request, cancellationToken);
            //
        }
    }
}

创建自定义委派处理程序

没有返回到res的原因是流位置被设置为请求内容的末尾,而不是开始。此外,反应是错误的,因为基地。没有正确等待SendAsync方法。

正确实现如下:

public class ContentValidationHandler : DelegatingHandler
{
    private static log4net.ILog Log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
        CancellationToken cancellationToken)
    {
        var response = await base.SendAsync(request, cancellationToken);

        Stream strea = new MemoryStream();
        await request.Content.CopyToAsync(strea);
        strea.Position = 0;
        StreamReader reader = new StreamReader(strea);
        String res = reader.ReadToEnd();
        Log.Info("request content: " + res);
        return response;



        //
    }


}