在Azure函数之间对HttpClient / RestClient使用静态对象是否安全

时间:2019-03-06 01:31:23

标签: azure azure-functions restsharp dotnet-httpclient

情况:我有许多天蓝色函数,可以从各种网站获取数据。网站的域发生了变化,每个功能都进行了多个http调用。当网站A的功能不从网站B提取数据时,非常重要。 我读到的是最好重用您的httpclient / restclient等。
链接:HttpClient best practices in Azure Functions

但是我想要有关如何正确执行此操作的建议。

public class WebsiteCaller
{
private static RestClient httpClient = new RestSharp.RestClient();

public WebsiteCaller(string domainName)
{
    httpClient = new RestClient(domainName);

}
public object GetWebData1(string parameters)
{
    //use httpClient with parameters and return data

}
public object GetWebData2(string parameters)
{
    //use httpClient with parameters and return data
}

}

public class Manager
{
public void GetDataAndDoStuff()
{
    var webConnection = new WebsiteCaller("clientnameDomain.com");
    var result1 = webConnection.GetWebData1("name=something");
    //Do something with result1
    var result2 = webConnection.GetWebData2("name=result1Info");
    //Continue making more http calls
}

}

如果从队列触发器中触发了此功能,则每分钟可能发生数百次。我是否需要使用Job2中的RestClient从队列1中担心Job1。有更好的方法来解决这个问题吗?
我在应用程序的某些部分使用了HttpClient,在其他部分(新的和旧的)都使用了RestClient。这就是为什么我在这个问题中都提到这两个原因。 这仍然在Azure Functions 1.x .net标准中

1 个答案:

答案 0 :(得分:2)

Azure函数使用一个执行模型,其中在同一进程中可以同时执行多个函数的多个执行。如果您在该过程中定义了多个函数引用的静态变量,那么绝对可以在这些函数的执行中重用该静态变量。

对于HttpClient之类的类型,通常需要这种行为。通常,您将希望在一个函数的多个执行之间重用同一HttpClient实例,因为这样可以重用基础连接,并且HttpClient是线程安全的。我对RestClient并不熟悉,您需要自行研究其线程安全性。

如果您需要在要与之通信的每个域中为客户端对象配置特定的设置,那么您可能需要创建一个静态的客户端字典,每个域中包含一个客户端。