首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WebApi中用于响应的DelegatingHandler

WebApi中用于响应的DelegatingHandler
EN

Stack Overflow用户
提问于 2012-08-15 21:39:44
回答 2查看 47.8K关注 0票数 29

我目前正在使用几个委托处理程序(从DelegatingHandler派生的类)在发送请求之前对其进行处理,比如验证签名等。这非常好,因为我不必在所有调用中重复签名验证(例如)。

我想在同一个web请求的响应上使用相同的原则。响应是否有类似于DelegatingHandler的内容?在某种程度上,在响应返回到方法之前捕获响应的方法?

附加信息:我正在使用HttpClient.PutAsync(...)调用web api

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-15 22:01:21

是。您可以在continuation任务中执行此操作。

我来解释一下,here

例如,此代码(来自上面的博客)跟踪请求URI,并向响应添加一个虚拟标头。

代码语言:javascript
复制
public class DummyHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        // work on the request 
       Trace.WriteLine(request.RequestUri.ToString());

       var response = await base.SendAsync(request, cancellationToken);
       response.Headers.Add("X-Dummy-Header", Guid.NewGuid().ToString());
       return response;
    }
}
票数 49
EN

Stack Overflow用户

发布于 2013-07-29 09:23:06

下面是一个截取请求和响应的示例。被覆盖的方法SendAsync用于捕获原始请求,而名为ResponseHandler的方法用于捕获响应。

捕获原始请求和响应的示例

代码语言:javascript
复制
using System.Net.Http;
using System.Threading.Tasks;
namespace webAPI_Test
{
    public class MessageInterceptor : DelegatingHandler
    {
        protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
        {
            // CATCH THE REQUEST BEFORE SENDING TO THE ROUTING HANDLER
            var headers = request.ToString();
            var body = request.Content.ReadAsStringAsync().Result;
            var fullRequest = headers + "\n" + body;

            // SETUP A CALLBACK FOR CATCHING THE RESPONSE - AFTER ROUTING HANDLER, AND AFTER CONTROLLER ACTIVITY
            return base.SendAsync(request, cancellationToken).ContinueWith(
                        task =>
                        {
                            // GET THE COPY OF THE TASK, AND PASS TO A CUSTOM ROUTINE
                            ResponseHandler(task);

                            // RETURN THE ORIGINAL RESULT
                            var response = task.Result;
                            return response;
                        }
            );
        }

        public void ResponseHandler(Task<HttpResponseMessage> task)
        {
            var headers = task.Result.ToString();
            var body = task.Result.Content.ReadAsStringAsync().Result;

            var fullResponse = headers + "\n" + body;
        }
    }
}

要使用此方法,需要标识类并将其注册为MessageHandler。我将以下行添加到我的Global.asax文件中...

示例如何注册新的MessageInterceptor类

代码语言:javascript
复制
GlobalConfiguration.Configuration.MessageHandlers.Add(new MessageInterceptor());

这是我的完整Global.asax文件。注意MessageInterceptor是如何被引用的……

显示MessageInterceptor集成的Global.asax的完整版

代码语言:javascript
复制
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
namespace webAPI_Test
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801

    public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            GlobalConfiguration.Configuration.MessageHandlers.Add(new MessageInterceptor());
        }
    }
}
票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11970313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档