Ошибка регистрации URL в WCF при использовании привязки Http - PullRequest
0 голосов
/ 22 сентября 2009

Я пытаюсь разместить две службы WCF в одном приложении. Я хочу, чтобы они использовали один и тот же BaseAddress, но имели свои собственные URL-адреса, например: net.tcp: // localhost: 1234 / service1 и net.tcp: // localhost: 1234 / service2

Следующий конфиг позволяет мне сделать это:

<system.serviceModel>
    <services>
        <service name="VanillaWcf.Shared.MyService" behaviorConfiguration="beh">
            <endpoint address="myservice" binding="netTcpBinding" name="tcpEndPoint" contract="VanillaWcf.Shared.IMyService" />
            <endpoint address="myservice" binding="wsHttpBinding" name="httpEndPoint" contract="VanillaWcf.Shared.IMyService"/>
            <host>
                <baseAddresses>
                    <add baseAddress="net.tcp://localhost:1234" />
                </baseAddresses>
            </host>
        </service>
        <service name="VanillaWcf.Shared.SecondService" behaviorConfiguration="beh">
            <endpoint address="secondService" binding="netTcpBinding" name="tcpEndPoint" contract="VanillaWcf.Shared.ISecondService"/>
            <endpoint address="secondService" binding="wsHttpBinding" name="httpEndPoint" contract="VanillaWcf.Shared.ISecondService"/>
            <host>
                <baseAddresses>
                    <add baseAddress="net.tcp://localhost:1234"/>
                </baseAddresses>
            </host>
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="beh">
                <serviceMetadata httpGetEnabled="false"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>

И код:

        ServiceHost host = new ServiceHost(typeof(MyService));
        ServiceHost secondHost = new ServiceHost(typeof(SecondService));

        host.Open();
        secondHost.Open();

Это отлично работает.

Однако я получаю исключение, когда добавляю http://localhost:4321 в качестве базового адреса обеих служб в конфигурации.

Исключение составляют: ChannelDispatcher в 'http://localhost:4321/' с контрактом (-ами) "IHttpGetHelpPageAndMetadataContract"' не может открыть свой IChannelListene ' с внутренним исключением Регистрация для URI уже существует http://localhost:4321

У меня нет конфигурации MEX, и я не хочу ее.

Примечание. Моя служба NetPortSharing отключена.

Ответы [ 4 ]

2 голосов
/ 22 сентября 2009

У вас не может быть двух базовых адресов с одинаковой схемой (net.tcp) и одним и тем же адресом - вам придется что-то изменить.

Одной из возможностей может быть не использование базовых адресов, а полное указание адресов net.tcp на двух ваших конечных точках. Это может сработать (должно быть, потому что весь адрес для этих двух служб различен).

<service name="VanillaWcf.Shared.MyService" behaviorConfiguration="beh">
   <endpoint name="tcpEndPoint" 
       address="net.tcp://localhost:1234/myservice1" 
       binding="netTcpBinding" 
       contract="VanillaWcf.Shared.IMyService" />
</service>

Марк

0 голосов
/ 28 сентября 2009

Я нашел ответ, но не могу понять, почему! Оказывается, при использовании net.tcp один и тот же базовый адрес может использоваться с разными адресами службы, то есть net.tcp: // localhost: 1234 в качестве базового адреса и / service1 и /service2.

Однако при использовании http полный URL-адрес должен быть указан на уровне обслуживания: т.е. оставьте базовый адрес пустым и используйте http://localhost:4321/service1 и http://localhost:4321/service2 на уровне обслуживания.

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

0 голосов
/ 23 сентября 2009

Как правило, только одно приложение может прослушивать порт TCP одновременно.

Для net.tcp MS проделала определенную работу, чтобы разрешить совместное использование портов. См:

http://technet.microsoft.com/en-us/library/cc753154.aspx

Но это относится к привязке net.tcp. Поэтому у вас возникает проблема, когда вы пытаетесь прослушивать http на том же порту.

0 голосов
/ 22 сентября 2009

Совместное использование порта возможно, но вам нужно правильно настроить все.

См. http://msdn.microsoft.com/en-us/library/ms734772.aspx

...