2016-12-01 1 views
0

ASP.NET Web Form에서 .NET 4.5 HttpClient 클래스를 사용하고 싶습니다. 내가 한마디 책에 C# 5.0 (페이지 663) 읽기 : 우리의 ASP.NET 웹 폼 웹 사이트에서ASP.NET 웹 양식의 .NET 4.5 HttpClient 사용

Unlike with WebClient, to get the best performance with HttpClient, you must reuse same instance (otherwise things such as DNS resolution may be unnecessarily repeated.) HttpClient permits concurrent operations, . . .

을, 우리는 다른 웹 사이트에 연결해야합니다. 모든 요청에서 단일 인스턴스를 사용하기 위해 응용 프로그램 속성의 HttpClient 인스턴스를 만들었습니다. 이 같은 Global.asax에 뭔가에 가 기록됩니다 그것을하는 것이 좋습니다 :

Application.Add("MateCatWorker", new HttpClient()); 

내 질문이다?

+2

왜 이것이 좋지 않다고 생각하십니까? –

+0

왜냐하면 : 위의 연습으로 웹 사이트를 방문했을 때 고객의 2 가지 종류의 오류가 발생하여 그 이유를 이해할 수 없기 때문입니다. –

+1

그래서 그것을 고치려고 했습니까? 또한 무언가가 효과가 없기 때문에 모범 사례가 아니라는 것을 의미하는 것은 아닙니다. 단지 실천을 제대로 수행하지 못하는 것일 수 있습니다. –

답변

1

좋은 습관 : 아니오, 제 생각에는 아닙니다. 애플리케이션 컨텍스트는 웹 팜의 인스턴스간에 동기화 될 수 있으므로 이러한 변수를 저장하는 데 실제로 사용하지는 않을 것입니다.

작동합니까?

  • CancelPendingRequests
  • DeleteAsync
  • GetAsync
  • GetByteArrayAsync
  • : 그 여러 스레드에서 안전하게 사용할 수 있기 때문에 예, 당신은 this MSDN article의 설명 부분에서 언급 한 비동기 방법 중 하나를 사용하는 경우
  • GetStringAsync
  • 솔직히
  • SendAsync

PutAsync

  • PostAsync
  • , 나는 그것에 대해 너무 많이 걱정하지 것이다. 좁은 루프에서 호출을 실행하는 경우 동일한 객체를 다시 사용하십시오. 그렇지 않은 경우 다시 사용하지 마십시오.

  • +0

    대답 해 주셔서 감사합니다.하지만이 문장의 의미는 무엇입니까? '웹 팜의 인스턴스간에 응용 프로그램 컨텍스트가 동기화 될 수 있습니다.' –

    +0

    웹 팜에서 동일한 응용 프로그램을 실행중인 경우 응용 프로그램 컨텍스트를 공유합니다. 하지만 그것은 현재의 질문에 너무 높을 수 있습니다. –

    +0

    @PatrickHofman 그는로드 밸런서를 사용하지 않는다고 생각합니다. 단일 웹 서버 일뿐입니다. –

    1

    MSDN에 HttpClient Class에 따르면이 방법은 스레드 안전 :

    • CancelPendingRequests
    • DeleteAsyn
    • GetAsync
    • GetByteArrayAsync
    • GetStreamAsync
    • GetStringAsync
    • PostAsync
    • PutAsync
    • SendAsync

    HttpClient is intended to be instantiated once and re-used throughout the life of an application. Instantiating an HttpClient class for every request will exhaust the number of sockets available under heavy loads. This will result in SocketException errors. Below is an example using HttpClient correctly.

    그리고 나는 HttpClientApplication로를 저장하지 않는 것이 좋습니다, 나는 싱글의 팬이 아니에요하지만위한 싱글 톤 클래스를 생성 훨씬 더 좋다.

    public class GoodHttpClient 
    { 
        // OK 
        private static readonly _httpClient HttpClient; 
    
        static GoodHttpClient() 
        { 
         _httpClient = new HttpClient(); 
        } 
    } 
    
    +0

    ASP.NET WF는 컨트롤러를 사용하지 않습니다. 또한 페이지에 변수를 저장하는 것은 일반적으로 한 지점 만 호출하므로 매우 유용하지 않습니다. –

    +0

    @PatrickHofman 네, 맞습니다. 지금 바꿀 것입니다. –