0

我有几个关于 WCF 的问题: - 程序可以同时充当客户端和服务器吗?- 我的代码有什么问题:

服务:

[ServiceContract]
public interface IShout
{
    [OperationContract]
    String Broadcast(String message);
}

实施:

public class eveShout : IShout
{
    public String Broadcast(String message)
    {
        return message + " reply";
    }
}

我以构造函数的形式启动服务:

ServiceHost s = new ServiceHost(typeof(IShout));
s.AddServiceEndpoint(typeof(IShout), new BasicHttpBinding(), "http://localhost:9189");
s.Open();

当我单击另一个表单上的按钮时,我想发送消息并得到回复。我使用以下代码:

ChannelFactory<IShout> channel = new ChannelFactory<IShout>(new BasicHttpBinding(), "http://localhost:9189");
IShout shout = channel.CreateChannel();

String reply = shout.Broadcast("Test");

注意:所有代码都在同一个命名空间中。注意:我首先启动“服务器”(打开)然后应用程序继续。

当我运行代码时,服务器就创建好了。我使用 netstat -a 查看端口是否打开。当我运行命令时,我得到 9189 处于监听状态。但代码在命令回复 = 喊(“测试”)处停止。我得到一个异常说

00:00:59 后等待回复时请求通道超时...

4

2 回答 2

0

是的,您可以让应用程序同时充当客户端和服务器。

我看到一些可能需要纠正的事情。首先,尝试添加 OperationContract。

[ServiceContract]
public interface IShout
{
    [OperationContract]
    String Broadcast(String message);
} 

然后,取类的类型,而不是接口。

ServiceHost s = new ServiceHost(typeof(eveShout));
s.AddServiceEndpoint(typeof(IShout), new BasicHttpBinding(), "http://localhost:9189");
s.Open(); 

确保您有权访问命名空间(如果没有,s.Open() 应该抛出异常)。

net http add urlacl url=http://+:9189/ user=...

看看这些建议是否有帮助。

(哦,是的,在你的课堂上公开广播)

一个简单的例子 WindowsFormsApplication 看起来像这样......

// form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.ServiceModel;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ChannelFactory<IShout> channel = new ChannelFactory<IShout>(new BasicHttpBinding(), "http://localhost:9189");
            IShout shout = channel.CreateChannel();

            String reply = shout.Broadcast("Test"); 

        }
    }
}

// and Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.ServiceModel;

namespace WindowsFormsApplication1
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            ServiceHost s = new ServiceHost(typeof(eveShout));
            s.AddServiceEndpoint(typeof(IShout), new BasicHttpBinding(), "http://localhost:9189");
            s.Open(); 

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }

    public class eveShout : IShout
    {
        public String Broadcast(String message)
        {
            return message + " reply";
        }
    } 

    [ServiceContract]
    public interface IShout
    {
        [OperationContract]
        String Broadcast(String message);
    } 
}

看看你能不能得到像这样简单的东西。这至少会向你证明这是可以做到的,而且问题出在其他地方。

于 2012-08-12T09:52:46.237 回答
0

启用 WCF 调试。

最简单的方法是使用 WCF 服务配置编辑器。打开实用程序,然后浏览以打开应用程序的配置文件。从诊断部分只需单击“启用跟踪”。默认跟踪会很好。

运行应用程序后,框架会将日志文件转储到配置文件中指定的位置。双击打开它并阅读红色事件(这些是有异常或意外结果的事件)。它非常有帮助,应该可以帮助您确定问题发生在哪里。

于 2012-08-12T09:58:52.113 回答