在 FlurlClient 中禁用自动重定向
Posted
技术标签:
【中文标题】在 FlurlClient 中禁用自动重定向【英文标题】:Disable AutoRedirect in FlurlClient 【发布时间】:2017-10-07 00:30:54 【问题描述】:我正在使用FlurlHttp,我想为某些 API 调用禁用 AllowAutoRedirect。 我知道How can I get System.Net.Http.HttpClient to not follow 302 redirects?
WebRequestHandler webRequestHandler = new WebRequestHandler();
webRequestHandler.AllowAutoRedirect = false;
HttpClient httpClient = new HttpClient(webRequestHandler);
// Send a request using GetAsync or PostAsync
Task<HttpResponseMessage> response = httpClient.GetAsync("http://www.google.com")
但对于 Flurl,我只发现类似于中描述的方式 C# Flurl - Add WebRequestHandler to FlurlClient(下面的代码我还没有编译,可能会有一些错误)
public class HttpClientFactoryWithWebRequestHandler : DefaultHttpClientFactory
private readonly WebRequestHandler _webRequestHandler;
public HttpClientFactoryWithWebRequestHandler (WebRequestHandler webRequestHandler )
_webRequestHandler = webRequestHandler ;
public override HttpMessageHandler CreateMessageHandler()
var handler =_webRequestHandler ;
//Or var handler = new WebRequestHandler(_webRequestHandler );
return handler;
然后我可以为新的 FlurlClient 传递设置:
WebRequestHandler webRequestHandler = new WebRequestHandler();
webRequestHandler.AllowAutoRedirect = false;
var fc = new FlurlClient(url)
.ConfigureClient(c => c.HttpClientFactory =
new HttpClientFactoryWithWebRequestHandler (webRequestHandler));
它看起来可能更复杂。这是正确的方法还是可以更简单地完成?
2021 年更新:Flurl 现在支持开箱即用
await url.WithAutoRedirect(false).GetAsync()
;
在https://flurl.dev/docs/configuration/#redirects查看更多选项
【问题讨论】:
是否可以在应用范围内的所有客户端上禁用重定向? @ToddMenier,对于当前任务来说没关系,因为客户端是一个微服务,作为单独的小型 MVC 站点运行 【参考方案1】:这个答案在 Flurl 3.0 中已经过时了。根据公认的答案,Flurl 现在supports 提供了丰富的重定向功能。
感觉有点沉重,因为这是 Flurl 不直接支持的场景,所以需要在引擎盖下进行一些修改。你走在正确的轨道上,但我认为有几种方法可以简化它。首先,我建议在工厂内创建WebRequestHandler
。在外部创建它并传递它似乎没有必要。
public class NoRedirectHttpClientFactory : DefaultHttpClientFactory
public override HttpMessageHandler CreateMessageHandler()
return new WebRequestHandler AllowAutoRedirect = false ;
如果您希望默认情况下在应用程序范围内使用此行为,您可以在启动时全局注册它。那么你不需要对个人FlurlClient
s 做任何事情。
FlurlHttp.Configure(settings =>
settings.HttpClientFactory = new NoRedirectHttpClientFactory());
否则,如果您需要能够选择禁用它的FlurlClient
s,扩展方法会更容易一些:
public static IFlurlClient WithoutRedirects(this IFlurlClient fc)
fc.Settings.HttpClientFactory = new NoRedirectHttpClientFactory();
return fc;
然后像这样使用它:
new FlurlClient(url).WithoutRedirects()...
【讨论】:
感谢您的建议,但FlurlClient.HttpClient.AllowAutoRedirect = false;
和client.AllowAutoRedirect = false;
将不起作用。 AllowAutoRedirect 是 HttpClientHandler 的属性,而不是 HttpClient。我希望拥有FlurlClient.HttpClientHandler
财产。【参考方案2】:
Flurl 现在原生支持这个:
"https://example.com"
.WithAutoRedirect(false)
[...]
文档:https://flurl.dev/docs/configuration/#redirects
【讨论】:
【参考方案3】:我的实现基于 Todd 的回答(小类/方法名称更改)
使用示例:
var resp = await new FlurlClient(url).DisableRedirects().Request().AllowAnyHttpStatus().GetAsync();
resp.StatusCode.Should().Be(HttpStatusCode.Found);//302
实施:
public class HttpClientFactoryWithWebRequestHandler : DefaultHttpClientFactory
private readonly HttpMessageHandler _httpMessageHandler;
public HttpClientFactoryWithWebRequestHandler(HttpMessageHandler httpMessageHandler)
_httpMessageHandler = httpMessageHandler;
public override HttpMessageHandler CreateMessageHandler()
var handler = _httpMessageHandler;
return handler;
public static class FlurlClientExtensions
public static IFlurlClient DisableRedirects(this IFlurlClient fc)
var httpClientHandler = new HttpClientHandler AllowAutoRedirect = false;
fc.Settings.HttpClientFactory = new HttpClientFactoryWithWebRequestHandler(httpClientHandler);
return fc;
【讨论】:
以上是关于在 FlurlClient 中禁用自动重定向的主要内容,如果未能解决你的问题,请参考以下文章
如何禁用 nginx 入口控制器的自动 https 重定向?