在FlurlClient中禁用自动重定向

MiF*_*vil 5 redirect dotnet-httpclient flurl asp.net-core-webapi

我正在使用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")
Run Code Online (Sandbox Code Playgroud)

但是对于Flurl,我只找到了与C#Flurl中所述类似的方法 -将WebRequestHandler添加到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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,我可以为新的FlurlClient传递设置:

WebRequestHandler webRequestHandler = new WebRequestHandler();
webRequestHandler.AllowAutoRedirect = false;
var fc = new FlurlClient(url)
    .ConfigureClient(c => c.HttpClientFactory = 
                  new HttpClientFactoryWithWebRequestHandler (webRequestHandler));
Run Code Online (Sandbox Code Playgroud)

它看起来可能更加复杂。这是正确的方法还是可以更简单地完成?

Tod*_*ier 6

自 Flurl 3.0 起,此答案已过时。根据接受的答案,Flurl 现在支持大量现成的重定向功能。


感觉有点沉重,因为这是 Flurl 不直接支持的场景,因此需要在引擎盖下稍作修改。你走在正确的轨道上,但我认为有几种方法可以简化它。首先,我建议WebRequestHandler在工厂内部创建。在外部创建并传入它似乎没有必要。

public class NoRedirectHttpClientFactory : DefaultHttpClientFactory
{
    public override HttpMessageHandler CreateMessageHandler()
    {
        return new WebRequestHandler { AllowAutoRedirect = false };
    }
}
Run Code Online (Sandbox Code Playgroud)

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

FlurlHttp.Configure(settings =>
    settings.HttpClientFactory = new NoRedirectHttpClientFactory());
Run Code Online (Sandbox Code Playgroud)

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

public static IFlurlClient WithoutRedirects(this IFlurlClient fc) {
    fc.Settings.HttpClientFactory = new NoRedirectHttpClientFactory();
    return fc;
}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

new FlurlClient(url).WithoutRedirects()...
Run Code Online (Sandbox Code Playgroud)


Eri*_*sen 5

Flul 现在原生支持此功能:

"https://example.com"
  .WithAutoRedirect(false)
  [...]
Run Code Online (Sandbox Code Playgroud)

文档: https: //flurl.dev/docs/configuration/#redirects