2012-09-21 16 views
5

WCF用のRESTサービスを実装しました。このサービスは、多くのクライアントから呼び出すことができる1つの機能を提供し、この機能は完了するまでに1分以上かかります。だから私が望んでいたのは、各クライアントに対して、新しいオブジェクトが使用されるため、一度に多くのクライアントを処理できるということです。WCF RESTサービス:InstanceContextMode.PerCallが機能しない

私のインターフェースは次のようになります。

[ServiceContract] 
public interface ISimulatorControlServices 
{ 
    [WebGet] 
    [OperationContract] 
    string DoSomething(string xml); 
} 

そして、それの(テスト)の実装:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall] 
public class SimulatorControlService : SimulatorServiceInterfaces.ISimulatorControlServices 
{ 
    public SimulatorControlService() 
    { 
     Console.WriteLine("SimulatorControlService started."); 
    } 

    public string DoSomething(string xml) 
    { 
     System.Threading.Thread.Sleep(2000); 
     return "blub"; 
    } 
} 

問題は今ある:私は10を作成し、クライアント(または任意の番号を使用している場合)スレッドは、サービスを呼び出すたびに同時に実行されません。これは、コールが互いに処理されていることを意味します。なぜ誰が考えているのですか?

追加:クライアント側のコード

産卵スレッド:

 for (int i = 0; i < 5; i++) 
     { 
      Thread thread = new Thread(new ThreadStart(DoSomethingTest)); 
      thread.Start(); 
     } 

方法:事前に

private static void DoSomethingTest() 
    { 
     try 
     { 
      using (ChannelFactory<ISimulatorControlServices> cf = new ChannelFactory<ISimulatorControlServices>(new WebHttpBinding(), "http://localhost:9002/bla/SimulatorControlService")) 
      { 
       cf.Endpoint.Behaviors.Add(new WebHttpBehavior()); 

       ISimulatorControlServices channel = cf.CreateChannel(); 

       string s; 

       int threadID = Thread.CurrentThread.ManagedThreadId; 

       Console.WriteLine("Thread {0} calling DoSomething()...", threadID); 

       string testXml = "test"; 

       s = channel.StartPressureMapping(testXml); 

       Console.WriteLine("Thread {0} finished with reponse: {1}", threadID, s); 
      } 

     } 
     catch (CommunicationException cex) 
     { 
      Console.WriteLine("A communication exception occurred: {0}", cex.Message); 
     } 
    } 

ありがとう!

+0

どのようにクライアントの要求を生み出していますか?その上にいくつかのコードを表示できますか?質問を編集して詳細を追加することができます。 – Jeroen

+0

クライアント側のコードを追加しました。 – Cleo

+0

サービスが共有リソースを使用していない場合は、ServiceBehaviorをConcurrency MultipleでSingleに変更できます。これにより、1つのService Instanceが提供されます。これはマルチスレッドです(呼び出しごとに1つのスレッド)。 '[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single、ConcurrencyMode = ConcurrencyMode.Multiple)] ' – JanW

答えて

1

サービスはGUIによって制御されるので、「UseSynchronizationContext」属性は、問題を解決するために必要だった。

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode=ConcurrencyMode.Multiple, UseSynchronizationContext=false)] 
関連する問題