WCF EndpointNotFoundException
我正在开发一个简单的WCF服务,WCF EndpointNotFoundException,wcf,visual-studio-2010,sharpdevelop,Wcf,Visual Studio 2010,Sharpdevelop,我正在开发一个简单的WCF服务,MiniCalcService,它只有一个操作Add。客户端和主机都是控制台应用程序。客户端应用程序接收每个操作所需的操作数,并将它们传递给服务。该服务返回将在客户端控制台上显示的结果 主机正在运行 到目前为止,我所有的工作都是用代码完成的,没有app.config 没有传递大数据,只有两三个数字 这对我昨天起作用了。今天,当我尝试同样的事情时,它抛出以下异常: 没有可以接受消息的端点正在侦听 这是你的电话号码。这可能并不重要,但是minicalclient是
MiniCalcService
,它只有一个操作Add
。客户端和主机都是控制台应用程序。客户端应用程序接收每个操作所需的操作数,并将它们传递给服务。该服务返回将在客户端控制台上显示的结果
- 主机正在运行
- 到目前为止,我所有的工作都是用代码完成的,没有app.config
- 没有传递大数据,只有两三个数字
minicalclient
是在Visual Studio中开发的,而MiniCalcService
和MiniCalcHost
是在SharpDevelop中开发的
微型计算机系统:
using(ServiceHost host = new ServiceHost(typeof(MiniCalcService.Service), new Uri("http://localhost:8091/MiniCalcService")))
{
host.AddServiceEndpoint(typeof(MiniCalcService.IService),new BasicHttpBinding(),"Service");
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
host.Description.Behaviors.Add(smb);
host.Open();
Console.WriteLine("Serving MiniCalcService since {0}", DateTime.Now);
Console.Write("Press ENTER key to terminate the MiniCalcHost . . . ");
Console.ReadKey(true);
}
[ServiceContract(Namespace="learning.wcf.MiniCalc")]
public interface IService
{
[OperationContract]
double Add(params int[] operands);
}
小型客户机:
static string Calculator(string operation, params string[] strOperands)
{
EndpointAddress ep = new EndpointAddress("http://localhost:8091/MiniCalcService");
IService proxy = ChannelFactory<IService>.CreateChannel(new BasicHttpBinding(), ep);
int[] operands;
string result = string.Empty;
try { operands = Array.ConvertAll(strOperands, int.Parse); }
catch (ArgumentException) { throw; }
switch (operation)
{
case "add":
result = Convert.ToString(proxy.Add(operands));//<---EXCEPTION
break;
default:
Console.WriteLine("Why was this reachable again?");
break;
}
return result;
}
您能帮我确定导致此异常的原因吗
解决方案:我更改了此行:
EndpointAddress ep = new EndpointAddress("http://localhost:8091/MiniCalcService");
为此:
EndpointAddress ep = new EndpointAddress("http://localhost:8091/MiniCalcService/Service");
它成功了 我不确定您是否可以在WCF服务调用中使用
params
。。。。不管怎样,似乎没有必要
您可以试试这两个服务合同,看看它们是否有效:
[ServiceContract(Namespace="learning.wcf.MiniCalc")]
public interface IService2
{
[OperationContract]
int Add(int op1, int op2);
}
及
因此,当代码到达结束括号时,}
,将处理服务主机
实例,从而关闭服务主机。没有正在运行的服务主机了
您需要在调用host.Open()
之后的某个地方停止代码执行
Console.ReadLine();
或者别的什么
因此,您第一次声称主机正在运行的说法确实站不住脚——它只是短暂运行,然后立即再次终止….您能给我们看一下服务合同(
IService1
)吗?我添加了服务合同IService
。是的,它用ServiceContractAttribute修饰。没有理由不应该使用int,但我最初有一个Mul
方法,并且有double
,因为运营合同本质上是可变的。因此,对于Add
也使用double来保持一致性。如果您添加int
-您将始终得到int
-因此出于一致性原因,您也应该使用int
作为返回值<代码>双倍真的没有意义。另外:如果您确实想使用非int,那么您应该使用十进制
,以获得比double更高的精度。很抱歉,我确实有控制台。ReadKey(true)
,现在刚刚将其添加到代码中,因为我首先错过了它。这就是为什么首先提到主机正在运行的原因。@KishorNanda:用两个可能的新服务契约更新了我的响应-你能看看这些契约是否有效吗?我刚刚添加了一个新服务IService2,并以相同的方式实现和托管它。然后将代理复制到主机,并相应地更改代码以调用IService2。我仍然得到相同的EndpointNotFoundException.:(我将试用IService3,稍后再与您联系。Marc_,甚至IService3都不起作用。我应该提到1)由于我使用的是Windows 7,我从一开始就以管理员身份打开了这两个IDE;2) 在提出这个问题之前,我在Visual Studio中打开了SharpDevelop创建的项目并尝试了一下,但也没有成功。在我发布了上述评论之后,我可以克服困惑,看看昨天和今天之间发生了什么变化。我将你的帖子标记为答案,因为你帮助我完成了思考过程。谢谢
using(ServiceHost host = new ServiceHost(typeof(MiniCalcService.Service), new Uri("http://localhost:8091/MiniCalcService")))
{
host.AddServiceEndpoint(typeof(MiniCalcService.IService),new BasicHttpBinding(),"Service");
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
host.Description.Behaviors.Add(smb);
host.Open();
Console.WriteLine("Serving MiniCalcService since {0}", DateTime.Now);
Console.Write("Press ENTER key to terminate the MiniCalcHost . . . ");
}
Console.ReadLine();