1

我正在尝试制作我的第一个 WCF 程序。它应该很简单,但我无法让它工作。

到目前为止我已经完成的步骤:

  1. 创建 C# windows 窗体应用程序
  2. 添加按钮
  3. 向项目添加了 WCF 服务。
  4. 根据thisthis page tutorials更改了代码。

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();条线上。

我还检查netstat -a了cmd。并且似乎端口 8000 确实在侦听模式下打开。所以问题应该出在客户端部分。

操作系统 Windows 7 / VS 2010 / C#

4

1 回答 1

3

您在这里遇到了死锁问题,因为您的 WCF 服务托管在与 UI 相同的线程上。您可以尝试以下方法在另一个线程上托管服务。

[ServiceBehavior(UseSynchronizationContext = false)]
public class WCF : IWCF
{
    public string DoWork()
    {
        return " Hello There! ";
    }
}

这是WPF 线程模型UseSynchronizationContext的一些背景知识。或者,您可以将客户端调用线程化到您的服务,但这也可能会产生其他 UI 更新后果。

于 2013-02-24T16:03:34.863 回答