程序充当客户端和服务器

时间:2012-08-12 09:01:18

标签: c# .net wcf exception-handling

我有一些关于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处于侦听状态。但代码在命令reply = shout(“test”)处停止。我得到一个说

的异常
  

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

2 个答案:

答案 0 :(得分: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);
    } 
}

看看你是否可以得到像这种工作一样简单的东西。这至少会向你证明它可以完成,问题就在其他地方。

答案 1 :(得分:0)

启用WCF调试。

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

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