2009-04-20 12 views
0

DBと通信するWCFレイヤーへのサーバー呼び出しを頻繁に使用するAjaxベースのアプリケーションを開発しています。 クライアント(ASP.NETページ)から短い時間内に多くの呼び出しが基になるWCFサービスに影響を与えるたびに、システムがハングアップしてアイドル状態になります。ASP.NET - > WCF並行性の問題

このような並行性の問題をどうやって処理できますか?おかげさまで お使いの設定なしで

答えて

0

がお手伝いするのは難しいですが、

  • クライアントはchanellを呼び出した後、正常に閉じ/に配置されていますか?
  • あなたのサービスコールあたりシングルトンまたはセッションあたりのですか?
  • Fiddlerまたは他のトレースツールを使用してhttpトラフィックを捕まえましたか?
0

さて、問題はDBの同時実行、または関連するWebサーバのハードウェアではないと仮定して、ここにしようとするものだ... WCFは、私のアプリケーションの一つと同様の問題を引き起こしたいくつかのスロットリングのデフォルトを持っています。デフォルトは があなたの設定に以下を追加します(20同時通話/セッション/インスタンスのようなもの)は非常に低かった:

<!--add a behavior to modify the throttling --> 

<behaviors> 
<serviceBehaviors> 
<behavior name="LessThrottlingBehavior"> 
<serviceThrottling 
     maxConcurrentCalls="100" 
     maxConcurrentSessions="100" 
     maxConcurrentInstances="100" 
     /> 

    </behavior> 
    </serviceBehaviors> 
</behaviors> 

<!-- modify the service to point to this behavior --> 

<services> 
<service name="MyWCFServer.WCFServer" behaviorConfiguration="LessThrottlingBehavior"> 
</service> 
</services> 
1

私はあなたがあなたの.SVCとのWeb.config

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]をオンにしている疑いがありますセッションを必要とせず、AspNetCompatibilityRequirementsを無効にすることで問題を解決できます。

また、ReadOnlyが必要な場合もあります.Global.asax.cs内の特定のsvcのSessionStateBehaviorを変更することができます。順次ブロッキングが停止します。

protected void Application_BeginRequest(object sender, EventArgs e) { 
    if (Request.Path.Contains("AjaxTestWCFService.svc")) { 
     HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.ReadOnly); 
    } 
} 

しかし、SessionStateBehavior.ReadOnlyを使用すると、例外をスローせずにセッションに書き込むことはできません。書き込まれた値はnullとして返されます。

WCFサービスで実際に読み取り/書き込みセッションが必要な場合は、同じブロック動作を公開しない可能性のあるSQLServer aspsessionstate modeを試してみてください。

0

WCFレイヤーがHTTP経由で通信される場合、HTTPレイヤーが行う発信接続の最大数にヒットする可能性があります。

http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit.aspx

サーバー環境でのデフォルト値は、WCF層に、アプリケーションサーバーから最大10個の同時発信接続があるかもしれないことを意味し10です。同時WCF呼び出しの推定数に応じて、この値を変更してください。具体的に

、フロントのWebアプリケーション(WCFサービスを呼び出す1、NOT WCFサービスとの1)でApplication_Startにこれを置く:

System.Net.ServicePointManager.DefaultConnectionLimit = 200;