Azure Web角色 - 最大出站http连接

时间:2012-09-14 13:35:30

标签: asp.net asp.net-mvc azure azure-web-roles azure-configuration

我正在构建一个需要调用大量外部Web服务的Azure Web角色。

我记得对于ASP.Net 1.1,默认的maxconnection限制为2,如果你的应用程序需要更多,你可以调整它(这是非常低的,老实说)。在ASP.Net 2.0上,我相信他们提出了这个问题,建议是内核数量的12倍。

Azure Web角色的限制和调整方法有哪些?我将同时拥有数百或数千个并发出站请求。这是否意味着我需要更大的实例(更多内核),或者我可以通过使用更多“超小”实例并正确配置它们来实现这一点(即使这意味着每个服务器12个)?

谢谢。

1 个答案:

答案 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();
        ...
            }
        }
    }
}