C# 如何在没有HttpClientFactory的情况下向HttpClient添加多个HttpMessageHandler
我有一个用于发出web请求的控制台应用程序C# 如何在没有HttpClientFactory的情况下向HttpClient添加多个HttpMessageHandler,c#,.net,dotnet-httpclient,C#,.net,Dotnet Httpclient,我有一个用于发出web请求的控制台应用程序 var client = new HttpClient(); 我试图向它添加多个(实际上是的自定义实现),但只需要一个 这没关系 var client = new HttpClient(new LoggingHandler()); // OK 但这并没有编译: var client = new HttpClient( new LoggingHandler(), new Respons
var client = new HttpClient();
我试图向它添加多个(实际上是的自定义实现),但只需要一个
这没关系
var client = new HttpClient(new LoggingHandler()); // OK
但这并没有编译:
var client = new HttpClient(
new LoggingHandler(),
new ResponseContentProcessingHandler()); // Sadness
因为我的目标是.NET 4.0,所以我无法使用,这就是通常解释此问题的解决方案的方式:
HttpClient client = HttpClientFactory.Create(
new LoggingHandler(),
new ResponseContentProcessingHandler());
因为我只是在控制台应用程序中,而不是在ASP.NET应用程序中,所以我也不能这样做:
GlobalConfiguration.Configuration
.MessageHandlers
.Add(new LoggingHandler()
.Add(new ResponseContentProcessingHandler());
我已经看过了,其中似乎没有任何东西不能在.NET 4.0中编译,但除了滚动我自己的工厂(“受Microsoft源代码启发”)之外,是否有一种方法可以手动将许多HTTP消息处理程序添加到?以在.NET 4.0平台上通过控制台应用程序实现,最好的解决方案是将httpConfiguration传递给您的webapi库,或者如果您没有webapi代码,只需在webhost asp.net应用程序的global.ascx文件中编写此代码
protected void Application_Start(object sender, EventArgs e)
{
var config = GlobalConfiguration.Configuration;
WebAPIConfig.Configure(config);
}
//Code that will configure all message handlers in webapi
public static void Configure(HttpConfiguration configure)
{
configure.MessageHandlers.Add(new xyzhandler());
configure.MessageHandlers.Add(new ABCHandler());
}
在控制台应用程序中,放置承载webapi的Web主机的uri
private const string APiUri="http://localhost/api/get"
using(HttpClient cleint=new HttpClient()){
var response await cleint.GetAsync(ApiUri);
....
}
DelegatingHandler对内部处理程序有一个。如果您可以控制所有自定义处理程序,我认为您可以添加一个调用受保护构造函数的公共构造函数,如:
public class CustomHandler : DelegatingHandler
{
public CustomHandler(HttpMessageHandler innerHandler) : base(innerHandler)
{
}
}
并将它们链接起来:
var client = new HttpClient(
new CustomHandler(
new OtherCustomerHandler(
new HttpClientHandler()
)
)
);
我想你可以这样做:
var loggingHandler = new LoggingHandler();
var responseContentProcessingHandler = new ResponseContentProcessingHandler();
loggingHandler.InnerHandler = responseContentProcessingHandler;
var client = new HttpClient(loggingHandler);
因此,您不需要仅为链接目的创建CustomHandler。
这才是DelegatingHandler的真正目的。无论您是使用console还是asp.net,Web API都应该使用http协议。@Zara\u me您是说您可以在console应用程序中访问
GlobalConfiguration.Configuration.MessageHandlers
?因为我说我不能。HTTP协议与此有什么关系?如果您不能在控制台中使用HttpClientFactory,那么最好使用最小的网页托管和发送Httpconfiguration对象,并使用Fiddler2进行测试。“调用/注册”的实现多个处理程序是我无法理解的-你能编辑这个答案,包括一个代码片段来解释你的意思吗?+1用于实际显示如何链接多个处理程序,尤其是当HttpClientHandler
出现在最内层时,它可以保留使用其无参数构造函数时从HttpClient
获得的行为。文档提到了链接,但我在任何地方都看不到一个例子!
var loggingHandler = new LoggingHandler();
var responseContentProcessingHandler = new ResponseContentProcessingHandler();
loggingHandler.InnerHandler = responseContentProcessingHandler;
var client = new HttpClient(loggingHandler);