2012-11-14 70 views
0

我有一個負載測試器,調用我的WCF服務,並且我已經構建了它的選項來並行地運行調用。只有在並行運行時,所有線程都會收到以下錯誤:「服務器沒有提供有意義的回覆;這可能是由於合同不匹配,過早的會話關閉或內部服務器錯誤造成的。」WCF合同不匹配錯誤只有在並行運行時

這或多或少是我的代碼:

  if (runMultiThreaded) 
      { 
       ParallelOptions options = new ParallelOptions(); 
       options.MaxDegreeOfParallelism = System.Environment.ProcessorCount; 
       ParallelLoopResult loopResult = Parallel.For(0, numberOfTimesToTest, options, 
        (i, loopState) => 
        { 
         myService.MyOperation(); 
         if (loopState.ShouldExitCurrentIteration) return; 
        }); 
      } 
      else 
      { 
       for (int i = 0; i < test1NumberOfRuns; i++) 
       { 
         myService.MyOperation(); 
       } 
      } 

任何想法?讓我知道你是否需要更多細節。

更新:myService是我的服務的操作契約接口的一個實例,它是使用CreateChannel方法使用ChannelFactory創建的。

謝謝!

回答

2

我假設您的myServiceClientBase<T>子類或通過ChannelFactory<T>::CreateChannel明確創建的通道?如果是這樣,那麼這些實例不能保證是線程安全的,所以你需要每個工作線程的實例。

+0

這是一個通過ChannelFactory創建的通道,所以可以解釋它,謝謝。有沒有什麼方法可以用線程安全的方式來做到這一點,以便我不必爲每個線程創建一個實例?爲每個線程創建該實例的速度非常緩慢...... – Ceottaki

+0

嗯...... CreateChannel應該是WCF land中更快的操作之一。相反,ChannelFactory創建通常是您可以做的最慢的事情之一。您正在使用您正在與之交談的服務的會話?怎麼認證?這顯然也會影響新創建的渠道。 –

+0

我使用通道工廠創建通道的例程也使用OperationContext添加將傳遞身份驗證令牌的標頭。我不確定這會帶來多大的影響,但是我無法解決這個問題,令牌需要放在頭部,否則服務將無法工作。 – Ceottaki