2017-10-20 14 views
0

Visual Studio 2017、.NET 4.5でシンプルなWCFサービスを作成しました。 (新しい項目の追加 - > WCFサービス)。 web.configを変更し、aspNetCompatibilityEnabledtrueに設定しました。したがって、サービスはASP.NET互換モードで実行されています。aspNetCompatibilityEnabledがfalseに設定されているとWCF OneWayサービスが遅くなる

[OperationContract(IsOneWay = true)] 
void DoWork(); 

実装は次のようになります:期待のように、この作品

public void DoWork() 
{ 
    var threadId = Thread.CurrentThread.ManagedThreadId; 
    Debug.WriteLine("Starting..." + threadId); 
    Thread.Sleep(TimeSpan.FromSeconds(30)); 
    Debug.WriteLine("Finished..." + threadId); 
} 

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" 
    multipleSiteBindingsEnabled="true" /> 

サービスは、1つのOneWayの方法があります。リクエストを送信し、すぐに返信せずに返信することができます。私は多くのリクエストを送信し、すぐに戻ってきます。

私はaspNetCompatibilityEnabled="false"を変更し、サービスクラスに

[AspNetCompatibilityRequirements(
RequirementsMode = AspNetCompatibilityRequirementsMode.NotAllowed)] 

を設定する場合は、サービスが遅くなります。それは3つの要求しか処理できず、4番目の要求はただ待つだけです。サービスはすぐに答えなくても返されません。それは一度に3つの要求しか処理できないようです。

何がこの現象について説明していますか?すべての設定がデフォルトです。web.configに特別な設定はありません。

+0

の下に記載されている迅速なサービスであり、それが偽 – BipinR

+0

はい、まさに、それがポイントだにaspNetCompatibilityを設定する前に、3つの以上の要求を処理しました。 –

答えて

1

アプリケーションがIISでホストされていて、aspNetCompatibilityEnabled='false'を設定した場合、要求はASP.NET httpパイプラインを流れません。要求がパイプラインを利用していないため、低速な動作の理由の1つは、IISが要求を受け取り、WCFに渡すのに必要なスクリプトを実行するのに時間がかかることです。デフォルトでWCFは、異なる並行性レベルを指定するまで、一度に1つの要求を処理します。他のリクエストは、前のリクエストが処理されるまで待たなければなりません。要求キューを保持し、一度に1つずつ処理するのはASP.NET HTTPパイプラインです。この場合、ASP.NET HTTPパイプラインの利点は失われているので、非ASP.NETパイプラインは要求キューを適切に処理していないためです。 これがあなたの質問に答えることを願っています。この上でいくつかの追加の資料が

https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/wcf-services-and-aspnet

https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/wcf/servicehostingenvironment

+0

'aspNetCompatibilityEnabled'をオフにしても問題ないですか? –

+0

互換性を無効にすることは安全ですが、同時に複数の要求を処理する場合は、異なるWCFスロットルオプションを検討してください。 – BipinR

関連する問題