2017-10-07 52 views
1

我正在使用FlurlHttp,我想为某些API调用禁用AllowAutoRedirect。 我知道How can I get System.Net.Http.HttpClient to not follow 302 redirects?在FlurlClient中禁用AutoRedirect

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

它看起来更复杂,它可能是。这是正确的做法还是可以做得更简单?

+0

可以在应用程序范围内的所有客户端上禁用重定向吗? –

+0

@ToddMenier,对于当前任务没关系,因为客户端是作为单独的小MVC站点运行的微服务 –

回答

0

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

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

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

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()... 
+0

感谢您的建议,但FlurlClient.HttpClient.AllowAutoRedirect = false;'client.AllowAutoRedirect = false;'不会工作。 AllowAutoRedirect是[HttpClientHandler](https://msdn.microsoft.com/en-us/library/system.net.http.httpclienthandler(v = vs.110).aspx)的属性,而不是HttpClient。 我希望拥有FlurlClient.HttpClientHandler属性。 –

+0

你是对的。答案已更新。 –