Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WCF EndpointNotFoundException_Wcf_Visual Studio 2010_Sharpdevelop - Fatal编程技术网

WCF EndpointNotFoundException

WCF EndpointNotFoundException,wcf,visual-studio-2010,sharpdevelop,Wcf,Visual Studio 2010,Sharpdevelop,我正在开发一个简单的WCF服务,MiniCalcService,它只有一个操作Add。客户端和主机都是控制台应用程序。客户端应用程序接收每个操作所需的操作数,并将它们传递给服务。该服务返回将在客户端控制台上显示的结果 主机正在运行 到目前为止,我所有的工作都是用代码完成的,没有app.config 没有传递大数据,只有两三个数字 这对我昨天起作用了。今天,当我尝试同样的事情时,它抛出以下异常: 没有可以接受消息的端点正在侦听 这是你的电话号码。这可能并不重要,但是minicalclient是

我正在开发一个简单的WCF服务,
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();