进行REST调用时,C#的常用方法是:
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("http://localhost:9000/");
client.SendAsync(....);
}
但是,如果我希望每个出站请求都有自定义标头,而无需手动编码,该怎么办?使用WCF代理,我可以通过添加全局端点行为(例如IMessageInspector)来实现该结果,该行为将挂钩每个出站呼叫。
使用HttpClient,我不认为存在这样的挂钩点。也许我能做的最好的事情是为HttpClient创建一个自动添加标题的扩展方法。不幸的是,这意味着每个开发人员仍然必须自愿遵守并记住手动调用扩展方法。
我忽视的任何解决方案?
P.S。据我所知,REST应该是轻量级的,并且WCF的大部分抽象都被抛弃了。仍然没有伤害... ...
答案 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。您的扩展程序作为父级,您只需创建一个实例,以便其他人不会看到您在做什么。