我有一些关于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之后等待回复时请求通道超时...
答案 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服务配置编辑器。打开该实用程序,然后浏览以打开应用程序的配置文件。在诊断部分,只需单击“启用跟踪”即可。默认跟踪没问题。
运行应用程序后,框架会将日志文件转储到配置文件中指定的位置。双击打开它并阅读红色事件(这些是具有异常或意外结果的事件)。它非常有用,可以帮助您确定问题发生的位置。