2016-12-01 59 views
0

我想在ASP.NET Web窗体中使用.NET 4.5 HttpClient类。 我在C#5.0简而言之图书阅读(页663):在ASP.NET Web窗体中使用.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, . . .

在我们的ASP.NET Web窗体的网站,我们需要连接到其他网站。 我在应用程序属性中创建了一个HttpClient实例,以在所有请求中使用单个实例。在Global.asax中这样的事情 写的是:

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

我的问题是:这是一个好的做法呢?

+2

你为什么认为这不是好的做法? –

+0

因为:当我按照上述惯例推出我们的网站时,我遇到了来自客户的两种错误,我不明白为什么。 –

+1

那么你试图修复它?另外,仅仅因为某些事情不起作用并不意味着它不是最佳实践,它可能只是实践的一个不好的实施。 –

回答

1

一个好习惯:不,在我看来不是。请注意,应用程序上下文可能会在Web场中的实例之间同步,因此我不会真正使用它来存储此类变量。

它工作吗?是的,如果你使用的在this MSDN article的言论一节中提到的异步方法之一,因为这些是安全的在多线程的使用方法:

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

老实说,我不会太担心它。如果您在紧密循环中运行呼叫,请重复使用同一个对象。如果没有,请不要重复使用。

+0

感谢您的回答,但是这句话意味着什么:'请注意,应用程序上下文可能在Web场中的实例之间同步' –

+0

如果您在Web场中运行相同的应用程序,它将共享应用程序上下文。但是对于你目前的问题,这可能太高端了。 –

+0

@PatrickHofman我认为他不使用任何负载平衡器,它只是一个单一的Web服务器。 –

1

按照HttpClient Class MSDN上这些方法是线程安全的:

  • 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是的,你说得对,我现在要改变它。 –

相关问题