Невозможно сгенерировать прокси для автономной службы с «Добавить ссылку на службу» - PullRequest
0 голосов
/ 24 марта 2012

Я создал базовый калькуляторный сервис MiniCalc, который имеет только две операции. Добавьте и Mul, и разместите его в консольном приложении.

using(ServiceHost host = new ServiceHost(typeof(MiniCalcService.Service),
                                         new Uri("http://localhost:8091/MiniCalcService")))
{
    host.AddServiceEndpoint(typeof(MiniCalcService.IService),
                            new BasicHttpBinding(),
                            "Service");
    host.Open();
    Console.Write("Press ENTER key to terminate the MiniCalcHost . . . ");
}

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

EndpointAddress ep = new EndpointAddress("http://localhost:8091/MiniCalcService/Service");
IService proxy = ChannelFactory<IService>.CreateChannel(new BasicHttpBinding(),ep);

Мне удалось правильно вызвать контракт на обслуживание и получить результат, как и ожидалось.

Теперь я хотел создать прокси, используя Add Service Reference.

Я получаю следующую ошибку при нажатии кнопки «Перейти» в окне «Добавить ссылку на службу»

There was an error downloading 'http://localhost:8091/MiniCalcService/Service'.
The request failed with HTTP status 400: Bad Request.
Metadata contains a reference that cannot be resolved: 'http://localhost:8091/MiniCalcService/Service'.
Content Type application/soap+xml; charset=utf-8 was not supported by service http://localhost:8091/MiniCalcService/Service.  The client and service bindings may be mismatched.
The remote server returned an error: (415) Cannot process the message because the content type 'application/soap+xml; charset=utf-8' was not the expected type 'text/xml; charset=utf-8'..
If the service is defined in the current solution, try building the solution and adding the service reference again.

Что я пропускаю или делаю неправильно?

Ответы [ 2 ]

3 голосов
/ 24 марта 2012

Включить поведение обмена метаданными в ServiceHost.

using(ServiceHost host = new ServiceHost(typeof(MiniCalcService.Service),
                             new Uri("http://localhost:8091/MiniCalcService")))
{
    host.AddServiceEndpoint(typeof(MiniCalcService.IService),
                            new BasicHttpBinding(),
                            "Service");

    //Enable metadata exchange
    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
    smb.HttpGetEnabled = true;
    host.Description.Behaviors.Add(smb);

    host.Open();
    Console.Write("Press ENTER key to terminate the MiniCalcHost . . . ");
}

http://wcftutorial.net/WCF-Self-Hosting.aspx

1 голос
/ 24 марта 2012

Так как у вас нет .svc, я думаю, вы должны иметь это в своем сервисе .config:

<serviceHostingEnvironment multipleSiteBindingsEnabled="true">
        <serviceActivations>
            <add relativeAddress="Service.svc" service="MiniCalcService.Service" />
        </serviceActivations>
    </serviceHostingEnvironment>

После этого вам нужна опция для разрешения метаданных сервиса:

<serviceMetadata httpGetEnabled="true" />

Это немного сложнее, поэтому я советую вам создать новую службу WCF в новом решении, тогда вы сможете увидеть, как выглядит эта конфигурация.Так что вам нужно всего лишь сделать несколько конфигураций копирования / вставки.

После этого укажите:

http://localhost:8091/MiniCalcService/Service.svc

...