2015-04-10 2 views
1

Я использую HttpClient, чтобы поговорить с API. Сервер будет автоматически перенаправлять http:// запросы на https://, если они включены. Поэтому, чтобы защитить ключ API пользователей, я хочу создать тестовое соединение с веб-сайтом, чтобы проверить, перенаправлен ли я перед отправкой через API-ключ.Как узнать, подключен ли HttpClient через HTTPS

HttpClient перенаправляет правильно, но я не могу найти подходящий способ узнать, использует ли клиент HTTPS или нет. Я знаю, что я могу проверить, существует ли https:// в response.RequestMessage.RequestUri, но это, кажется, немного слоеное

public void DetectTransportMethod() 
{ 
    using (HttpClient client = new HttpClient()) 
    { 
     client.Timeout = TimeSpan.FromSeconds(20); 

     using (HttpResponseMessage response = client.GetAsync(this.HttpHostname).Result) 
     { 
      using (HttpContent content = response.Content) 
      { 
       // check if the method is HTTPS or not 
      } 
     } 
    } 
} 

ответ

1

Документация по HttpClient (MSDN) и HttpResponseMessage (MSDN) не содержат каких-либо методов, которые могут быть использованы для определения того, имеет ли запрос были сделаны над https. Несмотря на то, что проверка URI HttpResponseMessage действительно звучит flaky, я боюсь, что это самый простой и читаемый вариант. Реализация этого метода расширения для HttpResponseMessage, вероятно, является наиболее читаемой. Чтобы убедиться, что вы используете HttpClient, убедитесь, что WebRequestHandler (MSDN), прошедший в HttpClient, имеет свойство AllowAutoRedirect (MSDN), установленное в true.

Смотрите следующий метод расширения:

static class Extensions 
{ 
    public static bool IsSecure(this HttpResponseMessage message) 
    { 
     rreturn message.RequestMessage.RequestUri.Scheme == "https"; 
    } 
} 

И следующее консольное приложение, которое демонстрирует это работает. Для этого, однако, HTTP-сервер должен обновить соединение с https (как и Facebook), а свойство AllowAutoRedirectWebRequestHandler должно быть установлено на true.

static void Main(string[] args) 
{ 
    using (var client = new HttpClient(new HttpClientHandler { AllowAutoRedirect = true})) 
    { 
     client.Timeout = TimeSpan.FromSeconds(20); 

     using (var response = client.GetAsync("http://www.geenstijl.nl").Result) 
     { 
      Console.WriteLine(response.IsSecure()); 
     } 

     using (var response = client.GetAsync("http://www.facebook.com").Result) 
     { 
      Console.WriteLine(response.IsSecure()); 
     } 
    } 

    Console.ReadLine(); 
} 
+2

Вместо использования 'message.RequestMessage.RequestUri.ToString() ToLower() StartsWith ("https: //").. 'Вы можете просто использовать' message.RequestMessage.RequestUri.Scheme == «HTTPS "' –

+0

Хороший улов, спасибо! – TheDutchDevil

Смежные вопросы