WCF - один и тот же сервис на разных конечных точках IIS .svc с несколькими интерфейсами - PullRequest
0 голосов
/ 08 ноября 2011

Я пытаюсь добиться следующего:

  • Иметь один «полный» набор услуг для потребления внутренними приложениями
  • Предоставить подмножество этих методов сторонним организациям

Я попытался сделать это, создав одну службу, которая реализует два интерфейса

Например:

Интерфейс публичной службы

[ServiceContract(Namespace = "http://www.myurl.com/public/2011/10")]
public partial interface IPublicService
{
    [OperationContract]
    ResponseObjOne OperationAvailableToEveryone(RequestObjOne request);
}

Интерфейс частного сервиса

[ServiceContract(Namespace = "http://www.myurl.com/private/2011/10")]
public partial interface IPrivateService
{
    [OperationContract]
    ResponseObjOne OperationAvailableToEveryone(RequestObjOne request);

    [OperationContract]
    ResponseObjTwo OperationAvailableInternally(RequestObjTwo request);
}

Класс обслуживания для реализации обоих интерфейсов

public class Service : IPrivateService, IPublicService
{
    ResponseObjOne OperationAvailableToEveryone(RequestObjOne request)
    { }

    ResponseObjTwo OperationAvailableInternally(RequestObjTwo request)
    { }
}

Я бы сейчасхотел бы иметь возможность настроить это для запуска в качестве двух отдельных конечных точек в IIS.Итак, у меня есть файл .svc со следующим:

<%@ ServiceHost Language="C#" Debug="true"  Service="Adactus.Pulse.SOAServices.Service, Adactus.Pulse.SOAServices"  %> 

И я добавил следующее в web.config:

  <service name="Service">
    <endpoint address="/public" binding="basicHttpBinding" contract="IPublicService" />
    <endpoint address="/private" binding="basicHttpBinding" contract="IPrivateService" />
  </service>

Но если я сейчас перехожу к файлу .svc, то яувидеть все операции в WSDL, и если я добавлю / public к URL-адресу, я вижу 404. Итак, как мне этого добиться?

В идеале я хотел бы добавить другую конечную точку .svc и иметь возможность указать интерфейса также класс реализации службы в этих файлах SVC.Затем я могу заблокировать доступ к svc в IIS для защиты внутренней службы.

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

Есть идеи?Я поступаю об этом неправильно?

Ура, Роб

Ответы [ 2 ]

1 голос
/ 29 сентября 2012

Наблюдения : Ваш класс Service для реализации обоих интерфейсов кажется неправильным. оба интерфейса имеют одинаковое имя метода OperationAvailableToEveryone фактически вы должны явно реализовать свои интерфейсы.

У меня даже такой же запрос . На самом деле вы не можете просмотреть http://localhost:8001/service.svc/public вместо http://localhost:8001/public/service.svc. Тем не менее, вы можете создать прокси с http://localhost:8001/service.svc, и вы используете его как обычно, а ваш адрес клиента выглядит как

    </client>
        <endpoint address="http://localhost:8001/SOAService.svc/public"
            binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IPublicService"
            contract="SOAService.IPublicService" name="BasicHttpBinding_IPublicService" />
        <endpoint address="http://localhost:8001/SOAService.svc/private"
            binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IPrivateService"
            contract="SOAService.IPrivateService" name="BasicHttpBinding_IPrivateService" />
    </client>

Надеюсь, это поможет.

1 голос
/ 08 ноября 2011

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

...