在 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 ;
    

如果您希望默认情况下在应用程序范围内使用此行为,您可以在启动时全局注册它。那么你不需要对个人FlurlClients 做任何事情。

FlurlHttp.Configure(settings =>
    settings.HttpClientFactory = new NoRedirectHttpClientFactory());

否则,如果您需要能够选择禁用它的FlurlClients,扩展方法会更容易一些:

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 中禁用自动重定向的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用 nuxt 默认错误重定向

如何禁用 nginx 入口控制器的自动 https 重定向?

如何禁用 301 重定向,在 Apache 中将斜杠添加到目录名称

如何在Symfony 4.1中禁用尾部斜杠重定向?

如何在 Angular js 中禁用哈希重定向

如何在 Symfony 2 中 login_check 后禁用重定向