提问人:Cleo 提问时间:9/21/2012 最后编辑:Cleo 更新时间:9/22/2012 访问量:1840
WCF REST 服务:InstanceContextMode.PerCall 不起作用
WCF REST Service: InstanceContextMode.PerCall not working
问:
我已经为WCF实现了REST服务。该服务提供了一个可由多个客户端调用的函数,此函数需要 1 分钟以上才能完成。因此,我想要的是,对于每个客户端,使用一个新对象,以便可以一次处理多个客户端。
我的界面看起来像这样:
[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);
}
}
提前致谢!
答:
2赞
Cleo
9/22/2012
#1
由于该服务由 GUI 控制,因此需要“UseSynchronizationContext”属性来解决问题:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode=ConcurrencyMode.Multiple, UseSynchronizationContext=false)]
评论
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]