2015-05-29 3 views
3

У меня возникли проблемы с выяснением проблемы с сервисом WCF, который появился после того, как я применил к нему контракт «v2» для расширения функциональности. Все строит отлично, но когда я пытаюсь получить доступ к сервису в браузере, мне просто говорят, что он не может подключиться. Когда я пытаюсь добавить его в качестве ссылки на службу, я получаю аналогичное сообщение о проблемах с подключением. Однако, когда я удаляю конечную точку расширенного контракта из файла конфигурации и оставляю прежнюю версию «v1» неповрежденной, она работает нормально.Не удается получить доступ к сервису WCF после контрактов на обслуживание версий

Вот "v1" контракт:

namespace Company.Services.Ticketing.Retail.Contracts 
{ 
    [ServiceContract(Name = "OutletReportingContract_v1", Namespace = "https://enterprise.company.ie/Services/Retail")] 
    public interface IOutletReportingContract_v1 
    { 
     /* methods */ 
    } 
} 

А вот "v2" контракт:

namespace Company.Services.Ticketing.Retail.Contracts 
{ 
    [ServiceContract(Name = "OutletReportingContract_v2", Namespace = "https://enterprise.company.ie/Services/Retail")] 
    public interface IOutletReportingContract_v2 : IOutletReportingContract_v1 
    { 
     /* methods */ 
    } 
} 

Вот конечные точки в Web.config:

<service name="Company.Services.Ticketing.Retail.OutletService" behaviorConfiguration="Public"> 
    <endpoint address="1" binding="wsHttpBinding" bindingConfiguration="Standard" name="OutletReportingContract_v1" 
     contract="Company.Services.Ticketing.Retail.Contracts.IOutletReportingContract_v1" /> 
    <endpoint address="2" binding="wsHttpBinding" bindingConfiguration="Standard" name="OutletReportingContract_v2" 
     contract="Company.Services.Ticketing.Retail.Contracts.IOutletReportingContract_v2" /> 
    <endpoint address="mex" binding="mexHttpsBinding" name="IMetadataExchange" contract="IMetadataExchange" /> 
    </service> 

И вот сообщение об ошибке, которое появляется в средстве просмотра событий:

WebHost не смог обработать запрос. Информация об отправителе: System.ServiceModel.Activation.HostedHttpRequestAsyncResult/28075619 Исключение: System.Web.HttpException (0x80004005): Канал активно не прослушивался в 'https://phil-pc.company.local/Services/Retail/OutletService.svc/_vti_bin/ListData.svc/ $ метаданных'. Это часто вызвано неправильным адресом URI. Убедитесь, что адрес, на который отправлено сообщение, соответствует адресу, по которому прослушивается служба. ---> System.ServiceModel.EndpointNotFoundException: не было канала, активно слушающего в 'https://phil-pc.company.local/Services/Retail/OutletService.svc/_vti_bin/ListData.svc/ $ метаданных'. Это часто вызвано неправильным адресом URI. Убедитесь, что адрес, на который отправлено сообщение, соответствует адресу, по которому прослушивается служба. в System.ServiceModel.Activation.HostedHttpTransportManager.HttpContextReceived (результат HostedHttpRequestAsyncResult) на System.ServiceModel.Activation.HostedHttpRequestAsyncResult.HandleRequest() в System.ServiceModel.Activation.HostedHttpRequestAsyncResult.BeginRequest() в System.Runtime.AsyncResult.End [TAsyncResult] (IAsyncResult результат) на System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End (IAsyncResult результат) Имя процесса: w3wp Идентификатор процесса: 8148

немного в тупик сейчас и оценил бы любую помощь :)

ответ

0

Вам необходимо разделить объявление своих услуг в web.config.

Если предположить, что ваши классы реализации названы OutletService_v1 & OutletService_v2 вы должны в конечном итоге с чем-то вроде этого:

<services> 
 
    <service name="Company.Services.Ticketing.Retail.OutletService_v1" behaviorConfiguration="Public"> 
 
    <endpoint binding="wsHttpBinding" bindingConfiguration="Standard" contract="Company.Services.Ticketing.Retail.Contracts.IOutletReportingContract_v1" /> 
 
    <endpoint address="mex" binding="mexHttpsBinding" name="IMetadataExchange" contract="IMetadataExchange" /> 
 
    </service> 
 

 
    <service name="Company.Services.Ticketing.Retail.OutletService_v2" behaviorConfiguration="Public"> 
 
    <endpoint binding="wsHttpBinding" bindingConfiguration="Standard" contract="Company.Services.Ticketing.Retail.Contracts.IOutletReportingContract_v2" /> 
 
    <endpoint address="mex" binding="mexHttpsBinding" name="IMetadataExchange" contract="IMetadataExchange" /> 
 
    </service> 
 
</services>

+0

Эй, спасибо за Ваш ответ! Я действительно забыл добавить факт, что контракт v2 наследуется от контракта v1, я обновляю свой пост, чтобы отразить это. Что касается вашего решения, то дело в том, что формат, который я использовал в своем сообщении, отлично подходит для другой службы, и нет очевидных различий в реализации. – achillesminor