我有一個相當簡單的WCF Web服務,託管在IIS Express(最終是完整的IIS),使用.Net 3.5。服務方法相當無趣。服務器500:太多待處理的安全對話
[ServiceContract]
public class MySvc
{
[OperationContract]
public Stuff MyMethod(string input)
{
Stuff result = DoSomething();
return result;
}
}
服務配置也相當通用:
<system.serviceModel>
<services>
<service behaviorConfiguration="MySvcBehavior" name="MySvc">
<endpoint address="" binding="wsHttpBinding" contract="MySvc">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="MySvcBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
該服務由一個代碼隱藏在ASPX應用消耗。有一個服務參考,導致一些同樣無趣的代碼。
MySvcClient svc = new MySvcClient();
Stuff result = svc.MyMethod("foo");
只要它是一次一個請求,一切正常,客戶端代碼得到預期的結果。好極了。
問題出現在我做一些非常原始的壓力測試時。我在瀏覽器中加載客戶端ASPX頁面,然後按住F5鍵。看到IIS Express窗口,首先結果返回爲狀態200,但幾分鐘後我開始看到狀態500.此時,服務將只響應狀態500,直到我重新啓動IIS Express。 (基於等待大約10分鐘)
在客戶端代碼中設置斷點,我看到完整的返回消息是「服務器上的掛起安全對話太多,請稍後再試。
在服務器代碼中設置一個斷點,我發現我的代碼甚至沒有被調用。所以它在通話和我的代碼的實際開始之間的某處失敗。
我的在線搜索並不十分看好,主要是導致相同suggestion of writing a custom binding以覆蓋maxPendingSessions財產,開始由絲線「有人告訴我,有一個[無名]配置文件設置」,然後導致聲稱微軟已經承認這是一個錯誤。
有關maxPendingSessions屬性的鏈接確實提到了超時時間爲兩分鐘的128個連接的限制,我當然可以看到我的測試方法將會中斷某些連接。這是一個公認的糟糕的測試方法的預期結果嗎?或者可以在配置中完成某些操作來改善這一點?
您是否使用'using'語句?連接將保持打開狀態直至處理完畢。除非有'use'語句,否則連接的清除由垃圾收集器決定。 – Caramiriel 2013-03-14 08:57:38
這確實是我的客戶端代碼的問題。但狀態500消息意味着在服務器端的一些事情是不高興的。 – ThatBlairGuy 2013-03-19 20:52:30