2011-08-29 27 views
1

我的web應用程序中的認證像SO一樣工作。用戶登錄時,會向第3個網站啓動後臺請求以獲取用戶信息。像這樣:AsyncController處理一定數量的請求

public AccountController : AsyncController 
{ 
    public void LogonAsync() 
    { 
     using(WebClient client = new WebClient()) 
     { 
      client.DownloadDataCompleted += (sender, args) => 
      { 
       //do something 
       AsyncManager.OutstandingOperations.Decrement(); 
      }; 

      AsyncManager.OutstandingOperations.Increment(); 
      client.DownloadDataAsync(new Uri(theUrlToValidate)); 
     }   
    } 

    public ActionResult LogonCompleted() 
    { 
     //do something 
    } 
} 

它看起來是正確的。但是,當Web應用程序聯機時,從性能監視器可以看到,排隊的請求越來越大,然後應用程序池關閉。我修改的動作,返回常量字符串:

public ActionResult Logon() 
{ 
    return Content("hello"); 
} 

但還是不能阻止應用程序的要求日益破碎。現在我想知道:(1)我的異步控制器是否正確實現?崩潰不是因爲錯誤的代碼,而是請求的數量,對不對? (2)如何提高大量請求時的性能?目前我有兩臺帶有WIN SERVER 2003的Web服務器,Web應用程序建立在MongoDB/ASP.NET MVC 3上。也許在SO工作的開發人員可以告訴我如何處理這個問題。

+0

在你發佈的例子中,'AccountController'不是從任何東西派生。我猜這是一個錯字。同樣當你說'返回內容(「你好」)''也是有問題的,好吧,這很難相信。像這樣的控制器操作可以處理許多請求。當我說很多時,我的意思是**很多**。所以問題在別的地方。 –

+0

@Darin Dimitrov:是的,這是一個錯字,我編輯了這篇文章。感謝您的提示。 –

回答

0

我不是很積極,但是您是否會遇到問題,因爲您在下載實際完成之前處置了webclient實例?我認爲.Dispose網絡客戶端的代碼應該移入下載完成處理程序,或者完全忽略它,因爲它將被垃圾回收清理。