2013-11-19 4 views
8

Я использую System.Net.HttpClient (.Net 4.5) в своем проекте MVC4. Я знаю, что один экземпляр HttpClient может использоваться для всех запросов Http через веб-приложение. Вот моя реализация синглтера HttpClient, который должен возвращать единственный экземпляр каждый раз.Является ли моя реализация синтаксиса HttpClient подходящей?

public sealed class HttpClientInstance: HttpClient 
{ 
    // singleton instance 
    private static readonly HttpClientInstance instance = new HttpClientInstance(); 

    static HttpClientInstance() { } 

    private HttpClientInstance() : base() { 
     Timeout = TimeSpan.FromMilliseconds(15000))); 
    } 
    /// <summary> 
    /// Returns the singleton instance of HttpClient 
    /// </summary> 
    public static HttpClient Instance 
    { 
     get 
     { 
      return instance; 
     } 
    } 
} 

Вы видите какие-либо проблемы с этим?

Я знаю, что я мог бы использовать Ninject для инъекции зависимости в однопользовательском пространстве, но это не относится к этой точке.

+4

Рабочий код, вероятно, должен быть перемещен в [Обзор кода] (http://codereview.stackexchange.com) – paqogomez

+1

В соответствии с этим http://msdn.microsoft.com/pl-pl/library/system.net.http .httpclient% 28v = vs.110%. Члены экземпляра 29.aspx не гарантируют безопасность потоков. Вы уверены, что не столкнетесь с проблемами параллелизма? –

+2

@WiktorZychla - HttpClient действует как сеанс для всех HTTP-запросов. Кроме того, все методы HTTP-операций являются потокобезопасными, как указано в той же самой ссылке, которую вы предоставили. – dotnetster

ответ

2

Есть несколько свойств, которые вы не можете изменить после того, как сделали первый запрос. Я думаю, что тайм-аут может быть одним из них, поэтому имейте в виду.

Вы также должны быть осторожны, чтобы отдельные запросы не связывались с DefaultRequestHeaders, поскольку это могло бы запутать другие запросы.

Всегда рекомендуется использовать экземпляры HttpClient. Создание синглтона - крайний случай, но с осторожностью он должен работать отлично для вас.

+2

DefaultRequestHeaders point отметил. Почему одноэлементный крайний случай? Если я не использую singleton, я просто создаю новый HttpClient для запроса в моем приложении MVC. – dotnetster

+2

@dotnetster Приложение может обращаться к нескольким API, поэтому иногда бывает полезно использовать два или три экземпляра HttpClient. –

+0

Я согласен с тобой. Мое намерение заключается в использовании экземпляра singleton для каждого случая использования. Итак, если я нахожу три разных API-интерфейса, тогда у меня будет три экземпляра singleton. – dotnetster

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