我正在尝试在Windows服务中托管的WCF和我的服务GUI之间进行通信.问题是我正在尝试执行OperationContract方法
"'net.tcp:// localhost:7771/MyService'中的ChannelDispatcher与合同'"IContract"'无法打开其IChannelListener."
我的app.conf看起来像这样:
端口7771正在侦听(使用netstat检查),svcutil能够为我生成配置.
任何建议,将不胜感激.
从异常堆栈跟踪
Server stack trace: at System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(Message reply, MessageFault fault, String action, MessageVersion version, FaultConverter faultConverter) at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc) at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout) at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs) at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
有一个内部的exeption(但不在Exeption.InnerExeption下但在Exeption.Detail.InnerExeption下 - ToString()方法没有显示)
已经存在URI'net.tcp:// localhost:7771/MyService'的注册.
但是我的服务只在app.config文件中指定了这个URI.在整个解决方案中,此URI在服务器中一次和客户端一次.
对于这种类型的异常,内部异常具有对诊断问题有用的信息.这是一个相当普遍的错误,可能由一堆不同的东西引起.
我解决了它:D
以下是问题的解释:
第一个BAD代码:
namespace WCFServer { public class Program : IWCFService { private ServiceHost host; static void Main(string[] args) { new Program(); } public Program() { host = new ServiceHost(typeof(Program)); host.Open(); Console.WriteLine("Server Started!"); Console.ReadKey(); } #region IWCFService Members public int CheckHealth(int id) { return (1); } #endregion } }
如您所见,服务合同是在托管服务的类中实现的.这导致整个错误的事情(也许typeof()运行一个构造函数,我不知道我对这个问题有建设性的意见).
好的代码:
namespace WCFServer { public class Program { private ServiceHost host; static void Main(string[] args) { new Program(); } public Program() { host = new ServiceHost(typeof(WCF)); host.Open(); Console.WriteLine("Server Started!"); Console.ReadKey(); } } public class WCF : IWCFService { #region IWCFService Members public int CheckHealth(int id) { return (1); } #endregion } }
两个文件的服务合同:
[ServiceContract] public interface IWCFService { [OperationContract] int CheckHealth(int id); }
App.config中