Служба WCF с 2 привязками и 2 базовыми адресами - PullRequest
1 голос
/ 13 мая 2010

Я написал службу WCF (я новичок), для которой я хочу предоставить 2 конечные точки (net.tcp & basicHttp). Проблема возникает, когда я пытаюсь настроить конечные точки. Если я настраиваю их как отдельные службы, то имена моих служб совпадают, что вызывает проблемы. Я видел рекомендованное создание классов прокладок (classA: MyService и ClassB: MyService), но это кажется вонючим.

        <services>
        <service name="MyWcfService.MyService"
                         behaviorConfiguration="MyWcfService.HttpBehavior">
            <endpoint name="ApplicationHttp"
                                address="Application"
                                binding="basicHttpBinding"
                                bindingConfiguration="HttpBinding"
                                contract="MyWcfService.Interfaces.IMyService" />
            <endpoint address="mex"
                                binding="mexHttpBinding"
                                contract="IMetadataExchange" />
            <host>
                <baseAddresses>
                    <add baseAddress="http://localhost:8731/MyWcfService/" />
                </baseAddresses>
            </host>
        </service>
        <service name="MyWcfService.MyService"
                         behaviorConfiguration="MyWcfService.MyBehavior">
            <endpoint name="Application"
                                address="Application"
                                binding="netTcpBinding"
                                bindingConfiguration="SecuredByWindows"
                                contract="EmsHistorianService.Interfaces.IApplicationHistorianService" />
            <endpoint address="mex"
                                binding="mexTcpBinding"
                                contract="IMetadataExchange" />
            <host>
                <baseAddresses>
                    <add baseAddress="net.tcp://localhost:49153/MyWcfService" />
                </baseAddresses>
            </host>
        </service>
    </services>

Я пытался использовать один сервис с базовым адресом, интегрированным в адрес, но это также дает мне ошибки

        <services>
        <service name="MyWcfService.MyService"
                         behaviorConfiguration="MyWcfService.HttpBehavior">
            <endpoint name="ApplicationHttp"
                                address="http://localhost:8731/MyWcfService/Application"
                                binding="basicHttpBinding"
                                bindingConfiguration="HttpBinding"
                                contract="MyWcfService.Interfaces.IMyService" />
            <endpoint address="http://localhost:8731/MyWcfService/mex"
                                binding="mexHttpBinding"
                                contract="IMetadataExchange" />
            <endpoint name="Application"
                                address="net.tcp://localhost:49153/MyWcfService/Application"
                                binding="netTcpBinding"
                                bindingConfiguration="SecuredByWindows"
                                contract="EmsHistorianService.Interfaces.IApplicationHistorianService" />
            <endpoint address="net.tcp://localhost:49153/MyWcfService/mex"
                                binding="mexTcpBinding"
                                contract="IMetadataExchange" />
        </service>
    </services>

Есть идеи?

1 Ответ

2 голосов
/ 13 мая 2010

Если у вас есть одна услуга (я предполагаю, что вы имеете в виду один контракт на обслуживание), и вы хотите выставить две конечные точки, то ваш вариант №2 должен быть тем, который нужно использовать.

Тем не менее, я вижу несколько проблем с вашей конфигурацией:

<service name="MyWcfService.MyService"
         behaviorConfiguration="MyWcfService.HttpBehavior">

Что включает в себя «MyWcfService.HttpBehavior» ?? Что-нибудь, что может вызвать проблемы с конечными точками net.Tcp ??

<endpoint name="ApplicationHttp"
          address="http://localhost:8731/MyWcfService/Application"
          binding="basicHttpBinding"
          bindingConfiguration="HttpBinding"
          contract="MyWcfService.Interfaces.IMyService" />

<endpoint name="Application"
          address="net.tcp://localhost:49153/MyWcfService/Application"
          binding="netTcpBinding"
          bindingConfiguration="SecuredByWindows"
          contract="EmsHistorianService.Interfaces.IApplicationHistorianService" />

Если у вас одна услуга - один контракт на обслуживание, - атрибут contract= обеих конечных точек приложения должен быть одинаковым.

Либо это первая (contract="MyWcfService.Interfaces.IMyService"), либо вторая (contract="EmsHistorianService.Interfaces.IApplicationHistorianService") - я не знаю - но она должна быть одинаковой для обеих <endpoint> записей, наверняка.

UPDATE:
@Sean: вы можете неправильно понимать механизм MEX: tcpMexBinding будет , а не отображать только привязки netTcp - и это полностью задумано и задумано. Привязки MEX представляют собой механизм, позволяющий получать метаданные о службе и всех ее конечных точках. Конечно, обе конечные точки MEX покажут все конечные точки приложения - в этом вся их цель. Конечные точки MEX предоставляют запрашивающему клиенту ( полные и нефильтрованные ) метаданные об услуге. Затем клиент сам решает, к какой конечной точке он может и хочет подключиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...