禁用FlurlClient中的自动重定向功能。

9

我正在使用FlurlHttp,我想为某些API调用禁用AllowAutoRedirect。 我知道如何让System.Net.Http.HttpClient不跟随302重定向?

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中查看更多选项。


在所有客户端应用程序范围内禁用重定向是否可行? - Todd Menier
@ToddMenier,对于当前的任务来说,这是可以的,因为客户端是作为单独的小型MVC站点运行的微服务。 - Michael Freidgeim
3个回答

6

随着Flurl 3.0的推出,此答案已经过时。根据接受的答案,Flurl现在原生支持丰富的重定向功能。


由于Flurl不直接支持这种情况,所以感觉有点沉重,因此需要在内部进行一些调整。你的方向是正确的,但我认为你可以简化它。首先,我建议在工厂内创建WebRequestHandler。在外部创建并传递似乎是不必要的。

public class NoRedirectHttpClientFactory : DefaultHttpClientFactory
{
    public override HttpMessageHandler CreateMessageHandler()
    {
        return new WebRequestHandler { AllowAutoRedirect = false };
    }
}

如果您希望默认情况下在整个应用程序中实现此行为,可以在启动时全局注册它。然后您就不需要对单独的FlurlClient进行任何操作。
FlurlHttp.Configure(settings =>
    settings.HttpClientFactory = new NoRedirectHttpClientFactory());

否则,如果您需要能够挑选禁用哪些FlurlClient的能力,使用扩展方法会使它变得更加容易:
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 属性。 - Michael Freidgeim

5

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接