WCF EndpointNotFoundException

时间:2012-03-26 20:24:15

标签: wcf visual-studio-2010 sharpdevelop

我正在开发一个简单的WCF服务MiniCalcService,它只有一个操作Add。客户端和主机都是控制台应用程序。客户端应用程序接收每个操作所需的操作数,并将它们传递给服务。该服务返回将在客户端控制台上显示的结果。

  • 主机正在运行
  • 到目前为止,我正在使用代码执行所有操作,并且没有app.config。
  • 没有传递大数据,只有两三个数字

昨天这对我有用。今天当我尝试同样的事情时,它会引发以下异常:

  

http://localhost:8091/MiniCalcService没有可以接受该消息的端点。

这是Stack Trace。并非它可能很重要,但MiniCalcClient是在Visual Studio中开发的,MiniCalcServiceMiniCalcHost是在SharpDevelop中开发的。

MiniCalcHost

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);
}

MiniCalcClient:

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;
}

服务合同服务

[ServiceContract(Namespace="learning.wcf.MiniCalc")]
public interface IService
{
    [OperationContract]
    double Add(params int[] operands);
}

您能否帮我确定造成此异常的原因?


解决方案:我改变了这一行:

EndpointAddress ep = new EndpointAddress("http://localhost:8091/MiniCalcService");

到此:

EndpointAddress ep = new EndpointAddress("http://localhost:8091/MiniCalcService/Service");

它有效。

1 个答案:

答案 0 :(得分:2)

我不确定你是否可以在WCF服务电话中使用params ....似乎没必要,反正....

您可以尝试这两个服务合同,只是为了看看它们是否有用:

[ServiceContract(Namespace="learning.wcf.MiniCalc")]
public interface IService2
{
    [OperationContract]
    int Add(int op1, int op2);
}

[ServiceContract(Namespace="learning.wcf.MiniCalc")]
public interface IService3
{
    [OperationContract]
    int Add(List<int> operands);
}

我只是想知道从你的服务合同中删除params是否可以让它运行 - 乍一看似乎一切都很好......


好的,所以这不是第一次尝试......


嗯 - 非常明显,真的:你在服务主机实例化中使用using块:

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 . . . ");
}

因此,当代码到达结束括号}时,ServiceHost实例将被处理,因此服务主机关闭。已经没有正在运行的服务主机了!

在调用host.Open()之后,您需要停止执行代码,例如

Console.ReadLine();

或其他。

所以你第一次声称​​主机正在运行确实没有阻止 - 它正在短暂运行然后立即再次终止.....