我正在构建一个需要调用大量外部Web服务的Azure Web角色。
我记得对于ASP.Net 1.1,默认的maxconnection限制为2,如果你的应用程序需要更多,你可以调整它(这是非常低的,老实说)。在ASP.Net 2.0上,我相信他们提出了这个问题,建议是内核数量的12倍。
Azure Web角色的限制和调整方法有哪些?我将同时拥有数百或数千个并发出站请求。这是否意味着我需要更大的实例(更多内核),或者我可以通过使用更多“超小”实例并正确配置它们来实现这一点(即使这意味着每个服务器12个)?
谢谢。
答案 0 :(得分:2)
实例的大小仅确定为您的实例保留的带宽(XS为5 Mbps,更多信息here)。您需要做的只是将DefaultConnectionLimit更改为2以上:
<system.net>
<connectionManagement>
<add address="*" maxconnection="12"/>
</connectionManagement>
</system.net>
如果要在Web应用程序中允许,请将其添加到web.config中。如果要在启动实例之前调用服务,请将以下内容添加到WebRole.cs中,例如:
public override bool OnStart()
{
ServicePointManager.DefaultConnectionLimit = 12;
return base.OnStart();
}
请记住,即使请求排队,如果以异步方式调用Web服务,也会获得更好的整体性能。这是一个非常基本的示例(假设您调用一个简单的REST服务,WCF客户端代理可以更好地支持异步请求):
<%@ Page Async="true" ... %>
public partial class AsyncPage : System.Web.UI.Page
{
private WebRequest req;
void Page_Load (object sender, EventArgs e)
{
AddOnPreRenderCompleteAsync (
new BeginEventHandler(BeginWebServiceCall),
new EndEventHandler (EndWebServiceCall)
);
}
IAsyncResult BeginWebServiceCall (object sender, EventArgs e,
AsyncCallback cb, object state)
{
req = WebRequest.Create("http://some.webs.service/rest/api");
return req.BeginGetResponse (cb, state);
}
void EndWebServiceCall (IAsyncResult ar)
{
using (var response = req.EndGetResponse(ar))
{
using var reader =
new StreamReader(response.GetResponseStream()))
{
var text = reader.ReadToEnd();
...
}
}
}
}