HttpClient的任何钩子?

时间:2014-09-22 23:25:49

标签: c# rest asp.net-web-api

进行REST调用时,C#的常用方法是:

using (var client = new HttpClient())
{
    client.BaseAddress = new Uri("http://localhost:9000/");
    client.SendAsync(....);
}

但是,如果我希望每个出站请求都有自定义标头,而无需手动编码,该怎么办?使用WCF代理,我可以通过添加全局端点行为(例如IMessageInspector)来实现该结果,该行为将挂钩每个出站呼叫。

使用HttpClient,我不认为存在这样的挂钩点。也许我能做的最好的事情是为HttpClient创建一个自动添加标题的扩展方法。不幸的是,这意味着每个开发人员仍然必须自愿遵守并记住手动调用扩展方法。

我忽视的任何解决方案?

P.S。据我所知,REST应该是轻量级的,并且WCF的大部分抽象都被抛弃了。仍然没有伤害... ...

2 个答案:

答案 0 :(得分:2)

您可以使用自定义HttpMessageHandler

public class YourServiceMessageHandler : HttpClientHandler
{
    protected override Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, CancellationToken cancellationToken)
    {
        // Add header to request here

        return base.SendAsync(request, cancellationToken);
    }
}

并将其传递给HttpClient构造函数:

HttpClient client = new HttpClient(new YourServiceMessageHandler());

答案 1 :(得分:0)

没有这样的钩子,但如果您正在编写HTTP API,则可以隐藏整个上传过程,以便API的用户只调用类似SendData(dataPackage);的内容,而不是使用HttpRequest。您的扩展程序作为父级,您只需创建一个实例,以便其他人不会看到您在做什么。