2017-10-07 20 views
1

J'utilise FlurlHttp et je souhaite désactiver AllowAutoRedirect pour certains appels d'API. Je sais How can I get System.Net.Http.HttpClient to not follow 302 redirects?Désactiver AutoRedirect dans FlurlClient

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

Mais pour Flurl je trouve que la manière similaire à décrit dans C# Flurl - Add WebRequestHandler to FlurlClient (je ne l'ai pas compilé encore le code ci-dessous, donc il peut avoir des erreurs)

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

ensuite, je peux passer le réglage d'un nouveau FlurlClient:

WebRequestHandler webRequestHandler = new WebRequestHandler(); 
webRequestHandler.AllowAutoRedirect = false; 
var fc = new FlurlClient(url) 
    .ConfigureClient(c => c.HttpClientFactory = 
        new HttpClientFactoryWithWebRequestHandler (webRequestHandler)); 

il semble plus compliqué que cela pourrait être. Est-ce la bonne façon de faire ou cela peut-il être fait plus simplement?

+0

Est-il acceptable de désactiver les redirections sur tous les clients de l'application? –

+0

@ToddMenier, Pour la tâche en cours c'est OK, car le client est un microservice fonctionnant comme un petit site MVC séparé –

Répondre

0

Cela semble un peu lourd parce que c'est un scénario que Flurl ne supporte pas directement, donc il faut un peu bricoler sous le capot. Vous êtes sur la bonne voie mais je pense qu'il y a plusieurs façons de la simplifier. D'abord, je suggère de créer le WebRequestHandler à l'intérieur de l'usine. La créer à l'extérieur et la transmettre semble inutile.

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

Si vous souhaitez appliquer ce comportement à l'ensemble de l'application, vous pouvez l'enregistrer globalement au démarrage. Ensuite, vous n'avez pas besoin de faire quoi que ce soit avec FlurlClient s.

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

Sinon, si vous avez besoin de la capacité de choisir qui FlurlClient s vous désactivez pour, une méthode d'extension serait un peu plus facile:

public static IFlurlClient WithoutRedirects(this IFlurlClient fc) { 
    fc.Settings.HttpClientFactory = new NoRedirectHttpClientFactory(); 
    return fc; 
} 

utiliser ensuite comme ceci:

new FlurlClient(url).WithoutRedirects()... 
+0

Merci pour votre suggestion, mais 'FlurlClient.HttpClient.AllowAutoRedirect = false;' et 'client.AllowAutoRedirect = false;' ne sera pas travail. AllowAutoRedirect est une propriété de [HttpClientHandler] (https://msdn.microsoft.com/en-us/library/system.net.http.httpclienthandler (v = vs.110) .aspx), pas HttpClient. Je souhaite avoir la propriété 'FlurlClient.HttpClientHandler'. –

+0

Vous avez raison. Réponse mise à jour –