使用 IsOneWay 属性的 WCF 问题
WCF issue with using IsOneWay attribute
我是 WCF 初学者。我创建了一个如下所示的 WCF 示例,但它没有正常工作。
WCF 服务:
ITestBiz:
[ServiceContract]
public interface ITestBiz
{
[OperationContract(IsOneWay = false)]
string Call(string clientName, int sleep);
[OperationContract(IsOneWay = true)]
void Call2(string clientName, int sleep);
}
测试业务:
[ServiceBehavior(InstanceContextMode= InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class TestBiz : ITestBiz
{
// maintain instance count
public int i=0;
public string Call(string ClientName, int sleep)
{
// increment instance counts
i++;
// display client name, instance number , thread number and time when
// the method was called
//Console.WriteLine("Client name :" + ClientName + "\t Instance:" +
// i.ToString() + "\t Thread:" + Thread.CurrentThread.ManagedThreadId.ToString() +
// "\t Time:" + DateTime.Now.ToString() + "\n\n");
string str ="Client name :" + ClientName + "\t Instance:" +
i.ToString() + "\t Thread:" + Thread.CurrentThread.ManagedThreadId.ToString() +
"\t Time:" + DateTime.Now.ToString() + "\n\n";
// Wait for 5 seconds
Thread.Sleep(sleep);
return str;
}
public void Call2(string ClientName, int sleep)
{
// increment instance counts
i++;
// display client name, instance number , thread number and time when
// the method was called
Console.WriteLine("Client name :" + ClientName + "\t Instance:" +
i.ToString() + "\t Thread:" + Thread.CurrentThread.ManagedThreadId.ToString() +
"\t Time:" + DateTime.Now.ToString() + "\n\n");
// Wait for 5 seconds
Thread.Sleep(sleep);
}
}
如您所见,我正在使用 PerCall 和多并发进行测试。
通过 Call func,我设置了 IsOneWay = false 以便我可以接收字符串并显示我的 wcf 客户端。结果如下:
Client name :Client 1 Instance:1 Thread:19 Time:1/19/2015 4:20:34 PM
Client name :Client 1 Instance:1 Thread:19 Time:1/19/2015 4:20:34 PM
Client name :Client 1 Instance:1 Thread:19 Time:1/19/2015 4:20:35 PM
Client name :Client 1 Instance:1 Thread:19 Time:1/19/2015 4:20:35 PM
Client name :Client 1 Instance:1 Thread:19 Time:1/19/2015 4:20:36 PM
Client name :Client 1 Instance:1 Thread:19 Time:1/19/2015 4:20:36 PM
Client name :Client 1 Instance:1 Thread:19 Time:1/19/2015 4:20:37 PM
Client name :Client 1 Instance:1 Thread:19 Time:1/19/2015 4:20:37 PM
Client name :Client 1 Instance:1 Thread:19 Time:1/19/2015 4:20:38 PM
Client name :Client 1 Instance:1 Thread:19 Time:1/19/2015 4:20:38 PM
它总是有相同的线程。这意味着在这种情况下没有多个线程?
对于 Call2 func,我设置 IsOneWay = true,当我在 WCF 服务上调试时,我发现线程号总是不同的。这意味着存在多个线程。
除了这个,我一无所知,也无处可寻。请指教
非常感谢。
IsOneWay
属性 设置为 false
表示客户端在继续执行下一条语句之前正在等待来自服务的回复消息。
尽管服务实例是多线程的(ConcurrencyMode.Multiple
),但来自客户端的每个请求都会一个接一个地同步发生。这导致每次调用都发生在它自己的服务实例和同一个线程中。
我是 WCF 初学者。我创建了一个如下所示的 WCF 示例,但它没有正常工作。
WCF 服务: ITestBiz:
[ServiceContract]
public interface ITestBiz
{
[OperationContract(IsOneWay = false)]
string Call(string clientName, int sleep);
[OperationContract(IsOneWay = true)]
void Call2(string clientName, int sleep);
}
测试业务:
[ServiceBehavior(InstanceContextMode= InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class TestBiz : ITestBiz
{
// maintain instance count
public int i=0;
public string Call(string ClientName, int sleep)
{
// increment instance counts
i++;
// display client name, instance number , thread number and time when
// the method was called
//Console.WriteLine("Client name :" + ClientName + "\t Instance:" +
// i.ToString() + "\t Thread:" + Thread.CurrentThread.ManagedThreadId.ToString() +
// "\t Time:" + DateTime.Now.ToString() + "\n\n");
string str ="Client name :" + ClientName + "\t Instance:" +
i.ToString() + "\t Thread:" + Thread.CurrentThread.ManagedThreadId.ToString() +
"\t Time:" + DateTime.Now.ToString() + "\n\n";
// Wait for 5 seconds
Thread.Sleep(sleep);
return str;
}
public void Call2(string ClientName, int sleep)
{
// increment instance counts
i++;
// display client name, instance number , thread number and time when
// the method was called
Console.WriteLine("Client name :" + ClientName + "\t Instance:" +
i.ToString() + "\t Thread:" + Thread.CurrentThread.ManagedThreadId.ToString() +
"\t Time:" + DateTime.Now.ToString() + "\n\n");
// Wait for 5 seconds
Thread.Sleep(sleep);
}
}
如您所见,我正在使用 PerCall 和多并发进行测试。
通过 Call func,我设置了 IsOneWay = false 以便我可以接收字符串并显示我的 wcf 客户端。结果如下:
Client name :Client 1 Instance:1 Thread:19 Time:1/19/2015 4:20:34 PM
Client name :Client 1 Instance:1 Thread:19 Time:1/19/2015 4:20:34 PM
Client name :Client 1 Instance:1 Thread:19 Time:1/19/2015 4:20:35 PM
Client name :Client 1 Instance:1 Thread:19 Time:1/19/2015 4:20:35 PM
Client name :Client 1 Instance:1 Thread:19 Time:1/19/2015 4:20:36 PM
Client name :Client 1 Instance:1 Thread:19 Time:1/19/2015 4:20:36 PM
Client name :Client 1 Instance:1 Thread:19 Time:1/19/2015 4:20:37 PM
Client name :Client 1 Instance:1 Thread:19 Time:1/19/2015 4:20:37 PM
Client name :Client 1 Instance:1 Thread:19 Time:1/19/2015 4:20:38 PM
Client name :Client 1 Instance:1 Thread:19 Time:1/19/2015 4:20:38 PM
它总是有相同的线程。这意味着在这种情况下没有多个线程?
对于 Call2 func,我设置 IsOneWay = true,当我在 WCF 服务上调试时,我发现线程号总是不同的。这意味着存在多个线程。
除了这个,我一无所知,也无处可寻。请指教
非常感谢。
IsOneWay
属性 设置为 false
表示客户端在继续执行下一条语句之前正在等待来自服务的回复消息。
尽管服务实例是多线程的(ConcurrencyMode.Multiple
),但来自客户端的每个请求都会一个接一个地同步发生。这导致每次调用都发生在它自己的服务实例和同一个线程中。