我正在努力制作我的第一个WCF计划。它应该非常简单,但我无法让它发挥作用。
到目前为止我已经完成的步骤:
IWCF.cs 代码:
using System;
...etc
namespace WCF_Application
{
[ServiceContract]
public interface IWCF
{
[OperationContract]
string DoWork();
}
}
WCF.cs 代码:
using System;
...
namespace WCF_Application
{
public class WCF : IWCF
{
public string DoWork()
{
return " Hello There! ";
}
}
}
按钮代码:
private void btnConnect_Click(object sender, EventArgs e)
{
// Starting the Server
ServiceHost svh = new ServiceHost(typeof(WCF));
svh.AddServiceEndpoint(
typeof(IWCF),
new NetTcpBinding(),
"net.tcp://localhost:8000");
svh.Open();
MessageBox.Show("Connected");
// Connecting Client to the server
ChannelFactory<IWCF> scf;
scf = new ChannelFactory<IWCF>(
new NetTcpBinding(),
"net.tcp://localhost:8000");
IWCF s = scf.CreateChannel();
string response = s.DoWork();
MessageBox.Show(response);
svh.Close();
}
我没有收到回复消息。该计划只是冻结。当我跟踪代码时,程序卡在strong response = s.DoWork();
行。
我还检查了cmd中的netstat -a
。似乎端口8000在聆听模式下打开。所以问题应该在客户端部分。
OS Windows 7 / VS 2010 / C#
答案 0 :(得分:3)
您遇到了死锁问题,因为您的WCF服务托管在与UI相同的线程上。您可以尝试以下方法在另一个线程上托管服务。
[ServiceBehavior(UseSynchronizationContext = false)]
public class WCF : IWCF
{
public string DoWork()
{
return " Hello There! ";
}
}
以下是WPF threading model和UseSynchronizationContext的背景信息。或者,您可以断开对您的服务的客户端调用,但这也可能会产生其他UI更新后果。