Ошибка конечной точки WCF от службы, размещенной самостоятельно

Я получаю "Конечная точка не найдена" при вызове службы WCF. Это самостоятельная служба в консольном приложении.

Вот мой код:

IService.cs

namespace ClassLibrary
{
[ServiceContract]
public interface IService
{
    [OperationContract]
    [WebGet]
    string GetMessage(string inputMessage);

    [OperationContract]
    [WebInvoke]
    string PostMessage(string inputMessage);
}

}

Service.cs

namespace ClassLibrary
{
public class Service : IService
{
    public string GetMessage(string inputMessage)
    {
        return "En GetMessage llega " + inputMessage;
    }

    public string PostMessage(string inputMessage)
    {
        return "En PostMessage llega " + inputMessage;
    }
}

}

И консольное приложение:

namespace ConsoleHost
{
class Program
{
    static void Main(string[] args)
    {            
        WebServiceHost host = new WebServiceHost(typeof(Service), new Uri("http://localhost:8000"));
        ServiceEndpoint ep = host.AddServiceEndpoint(typeof(IService), new WebHttpBinding(), "");
        ServiceDebugBehavior db = host.Description.Behaviors.Find<ServiceDebugBehavior>();
        db.HttpHelpPageEnabled = false;

        ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
        smb.HttpGetEnabled = true;
        host.Description.Behaviors.Add(smb);

        host.Open();
        Console.WriteLine("Service is up and running");
        Console.WriteLine("Press enter to quit ");
        Console.ReadLine();
        host.Close();
    }
}

}

Конфигурационного файла нет, потому что он есть в коде.

И звонок в сервис:

http://localhost:8000/

Любая помощь приветствуется. Спасибо!

2 ответа

Решение

Пара вещей. Услуги, размещенные с WebServiceHost не публикуйте метаданные, поэтому не пытайтесь получить WSDL только с именем службы.

Поскольку это WebGet, вы вызываете метод Get по умолчанию при вводе имени службы, поэтому вы должны указать все необходимые параметры в URL. Однако это не сработает, пока вы не укажете форму запроса в договоре. Сделайте это, изменив строку WebGet следующим образом:

[WebGet(UriTemplate = "{inputMessage}")]

Да, свойство атрибута должно соответствовать формальному параметру операции GetMessage(), в данном случае "inputMessage"

Когда служба запущена, введите следующий URL в браузер, чтобы убедиться, что служба работает:

http://localhost:8000/hello

Вы должны получить что-то вроде:

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">
En GetMessage llega hello</string>

Я нахожу это для вас WCF REST Self-Hosted 400 Bad Request Эффективно вы разрабатываете службу REST, и для этого есть две вещи, которые нужно знать: 1- вам не нужно добавлять EndPoint и Behaviors при использовании WebServiceHost 2- Rest Services не выставлен wsdl, так что вы не можете добавить ссылку на службу из VS, например.

Другие вопросы по тегам