2009-09-12 23 views
5

Domyślnie witryna sieci Web usług IIS 7 ma powiązanie net.tcp z ciągiem informacji o powiązaniu "808: ". Jeśli dodaję inne powiązanie net.tcp z "xxx:" wystąpi wyjątek:Hostowanie usługi WCF w IIS 7 (WAS) z wiązaniem net.tcp na DWÓCH portach TCP

Ta kolekcja zawiera już adres ze schematem net.tcp. W tym zbiorze może być maksymalnie jeden adres na schemat. Nazwa parametru: pozycja

Jak mogę rozwiązać ten problem i odsłuchać moją usługę w DWÓCH portach?

Odpowiedz

8

Zasadniczo w swojej usłudze powinieneś być w stanie zdefiniować dowolną liczbę punktów końcowych usługi na dowolnej liczbie portów.

Są dwa sposoby, aby to zrobić:

  • definiują adres bazową i względny adres w swojej końcowego usługi
  • określić pełny adres w każdym punkcie końcowym

Jeśli zrobić opcję nr 1, będziesz miał coś takiego:

<service name="YourService"> 
    <host> 
    <baseAddresses> 
     <add baseAddress="net.tcp://YourServer:5151/Services" /> 
    </baseAddresses> 
    </host> 
    <endpoint name="endpoint1" 
      address="Service1" 
      binding="netTcpBinding" 
      contract="IYourService" /> 
    <endpoint name="endpoint2" 
      address="Service2" 
      binding="netTcpBinding" 
      contract="IYourService" /> 
</service> 

Więc w tym przypadku, masz dwa punkty końcowe usługi dla tej samej umowy, a oni będą słuchać o adresy URL

net.tcp://YourServer:5151/Services/Service1 

i

net.tcp://YourServer:5151/Services/Service2 

można mieć mulitple punktów końcowych usługi, ale tylko jeden adres bazowy.

Inną opcją jest określenie żadnych adresów bazowych i podać swój pełny adres usług w końcowym bezpośrednio:

<service name="YourService"> 
    <endpoint name="endpoint1" 
      address="net.tcp://YourServer:5151/Services/Service1" 
      binding="netTcpBinding" 
      contract="IYourService" /> 
    <endpoint name="endpoint2" 
      address="net.tcp://YourServer:6868/Services/Service2" 
      binding="netTcpBinding" 
      contract="IYourService" /> 
</service> 

W tym przypadku, ponieważ jesteś definiowanie cały adres w punkcie końcowym, można wybrać dwa różne porty TCP, po jednym dla każdego punktu końcowego. To powinno działać bez problemu. Masz dwa oddzielne punkty końcowe na dwóch oddzielnych portach, zarówno nasłuchujących, jak i obsługiwanych przez tę samą klasę usług w tle.

Marc

+1

Czytałem gdzieś, że baseAddresses jest ignorowane w enigmencie. – Konstantin

+0

Zgadzam się z Twoim komentarzem i podam link, który tak mówi. Jeśli chodzi o IIS, adresy bazowe są w zasadzie ignorowane, ale powyższy przykład nadal obowiązuje z powodu dostarczania adresów punktów końcowych. Są one niejawnie używane wraz z informacjami o wiązaniu witryny w IIS. http://msdn.microsoft.com/en-us/magazine/cc163412.aspx – dyslexicanaboko

0

To znowu ja.

To działa z hostem siebie

<baseAddresses> 
      <add baseAddress="net.tcp://localhost" /> 
      <add baseAddress="net.tcp://localhost:12345" /> 
</baseAddresses> 

ale z IIS7 + WAS przyczyna wyjątek

nie można połączyć się z Net.TCP: // localhost: 12345/game2.svc. Próba połączenia trwała przez okres czasu 00: 00: 02.0936160. Kod błędu TCP 10061: Nie można nawiązać połączenia, ponieważ komputer docelowy aktywnie odmówił jego użycia 127.0.0.1:12345.

Pytanie było o IIS hostingu środowiska

2

starałem się deply usługi WCF do jednego z moich serwerów internetowych na drugi dzień i uruchomiony na problem.Otrzymałem następujący komunikat o błędzie: p>

Ta kolekcja zawiera już adres ze schematem http. W tym zbiorze może być maksymalnie jeden adres na schemat. Nazwa parametru: pozycja

Problem nie wystąpił na mojej lokalnej maszynie, ale wystąpił na serwerze sieciowym, przez co trudno było ustalić, co było przyczyną. Stało się to na serwerze, ponieważ mój serwer sieciowy jest we wspólnym środowisku hostingowym, w którym to przypadku usługa WCF musi również znać nagłówek hosta. W tym celu nawigowałem do pliku web.config i dodałem:

<serviceHostingEnvironment> 
<baseAddressPrefixFilters>  
    <add prefix=http://MyHostHeader /> 
</baseAddressPrefixFilters> 
</serviceHostingEnvironment> 
+1

W .NET 4.0 jest to naprawiane przez