2009-09-22 2 views
0

Я пытаюсь разместить две службы WCF в одном приложении. Я хочу, чтобы одни и те же BaseAddress, но имеют свои собственные URL-адреса что-то вроде: net.tcp: // Localhost: 1234/service1 и net.tcp: // Localhost: 1234/Service2Ошибка регистрации Url с WCF при использовании привязки Http

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

<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 отключена.

+0

еще одна проблема: у вас отсутствуют какие-либо адреса (базовый адрес или явные адреса конечных точек) для ваших привязок HTTP ..... –

+0

Я добавляю его, когда хочу привязать Http, и вот когда проблема начинается – Khash

ответ

2

У вас не может быть двух базовых адресов по той же схеме (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

Я не знаю, т. Если вы посмотрите на конфигурацию, у меня есть эти адреса: net.tcp: // localhost: 1234/myservice и net.tcp: // localhost: 1234/secondservice, и он работает. Вопрос в том, почему это не происходит, когда я изменяю net.tcp на Http, и я предполагаю, что это имеет какое-то отношение к IHttpGetHelpPageAndMetadataContract – Khash

+0

. Я думаю, проблема в том, что у вас есть поведение HTTP Get metadata на обоих этих одинаковых базовых адресах - так когда вы переходите к одному из них, как WCF должен знать, какие данные метаданных вы хотите увидеть? Вам нужно использовать два отдельных базовых адреса или изменить конечные точки метаданных на что-то отдельное для двух конечных точек (полный URL-адрес для конечных точек MEX, который не идентичен) –

+0

Уверен, что я вижу в моем вопросе. Если я не полностью осознаю, как это работает. – Khash

0

В общем только один приложение может прослушивать TCP-порт в то время.

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

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

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

0

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

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

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