WCF EndpointNotFoundException - PullRequest
       6

WCF EndpointNotFoundException

0 голосов
/ 27 марта 2012

Я работаю над простой службой WCF, MiniCalcService, которая имеет только одну операцию Add.Клиент и хост оба являются консольными приложениями.Клиентское приложение принимает операнды, необходимые для каждой операции, и передает их службе.Служба возвращает результат, который будет отображаться на клиентской консоли.

  • Хост работает
  • Я делаю все в коде до сих пор, и нет app.config.
  • Не передаются большие данные, только дваили три числа

Это работало для меня вчера.Сегодня, когда я попробовал ту же самую вещь, она выдает следующее исключение:

Не было прослушивающей конечной точки на http://localhost:8091/MiniCalcService, которая могла бы принять сообщение.

Вот Stack Trace .Не то чтобы это могло иметь значение, но MiniCalcClient разрабатывается в Visual Studio, а MiniCalcService и MiniCalcHost - в 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;
}

Сервисный контракт IService :

[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 Ответ

2 голосов
/ 27 марта 2012

Я не уверен, что вы можете использовать params в служебном вызове WCF .... в любом случае кажется ненужным ....

Не могли бы вы попробовать эти два договора на обслуживание вместо того, чтобы посмотреть, сработают ли они:

[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();

или что-то еще.

Итак, ваше первое утверждение о том, что Хост запущен действительно не работает - он работает ненадолго, а затем сразу же завершается .....

...