2011-07-28 8 views
7

Mam usługę WCF, która działa poprawnie w sieci LAN, ale próba dostępu do niej spoza usługi nie powiedzie się.WCF używa nazwy komputera zamiast adresu IP i nie można go rozwiązać.

Moja usługa WCF jest hostowana na polu win2k3, które używa statycznego adresu IP bez domeny.

+1

Jeśli działa lokalnie i WSDL pokazuje się na stronie internetowej portu 80, czy to możliwe, że twoja usługa korzysta z innych portów, a zapora routera blokuje dostęp z zewnątrz do tych portów? – Tod

+0

Zapora nie stanowi problemu, nazwa komputera nie może zostać rozwiązana poza siecią LAN, ale mam teraz rozwiązanie. W każdym razie. – baileyswalk

Odpowiedz

2

Znalazłem odpowiedź po tym, jak zacząłem kopać - oto, co znalazłem, mam nadzieję, że uda się uratować kogoś innego i przeszkadzać.

1.) Dodaj IP do adresu końcowego & dodać nazwę hosta z adresu bazowego IP tak:

<endpoint 
    address="http://xx.xx.xx.xx/ServiceApp/Service.svc" 
    binding="basicHttpBinding" contract="IService"> 
</endpoint> 
<host> 
    <baseAddresses> 
    <add baseAddress="http://xx.xx.xx.xx/ServiceApp/" /> 
    </baseAddresses> 
</host> 

To było na tyle, aby moje prace odniesienia usługa ale plik disco zaczęło jest zwracany z nazwą komputera zamiast IP (myślę, że było to po aktualizacji do .NET 4.0).

2.) Jeśli posiadasz nazwę domeny (www.myDomain.com), dodaj ją do nagłówka hosta w IIS.

3.) Dodaj nazwę komputera, adres IP & klientów do pliku hosts (Easy Fix nie zawsze jest możliwe, aby uzyskać wszystkich klientów, aby dodać do swojego pliku hosta jednak)

4.) najlepszym rozwiązaniem znalazłem wdrożyć Atrybut ServiceHosts fabryki jako per „Timetheos” post tutaj: http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/c7fd51a2-773e-41d4-95a0-244e925597fe

Ten pracował dobrze dla mnie, jak mogłem przetestować rozwijać & debugowania moją bibliotekę usług lokalnie, a następnie użyć aplikacji usług wdrożyć usługę do mojego serwer dev i po jego opublikowaniu nie trzeba było zmieniać żadnych plików konfiguracyjnych.

Cały ten proces był totalnym koszmarem i nie życzyłbym sobie tego nikomu, więc jeśli jesteś w takiej samej sytuacji i potrzebujesz więcej informacji na temat powyższych punktów, skontaktuj się z nami!

+0

Witaj, baileyswalk, kiedy zmieniam go na adres IP, pyta mnie o nazwę użytkownika i hasło, a kiedy podam, że nie łączy się z –

14

To właśnie dla mnie zadziałało. W pliku config

< serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
</system.serviceModel > 

Jeśli jest ustawiona na false, byłem coraz to szalony podstawienie nazwa_komputera.

multipleSiteBindingsEnabled="true" wydaje się być wszystkim, co muszę zrobić, aby działało tak, jak powinno.

+0

To działało dla mnie na Win Server 2012. – skjoshi

+0

Dziękuję, to odpowiednie rozwiązanie dla tego numer –

+0

Następnie powinieneś mieć adres względnej usługi w punkcie końcowym usługi. –

0

Ustaw punkt końcowy usługi i httpgeturl w ten sposób.

<services> 
    <service behaviorConfiguration="serviceBehaviour" name="Demo.Service.MultiEndPointsService"> 
     <endpoint address="http://192.168.1.2/Demo.Service/MultiEndPointsService.svc/basic" binding="basicHttpBinding" bindingConfiguration="basicBinding"  contract="Demo.Service.MultiEndPointsService" /> 
    </service> 
</services> 
<behaviors> 
    <serviceBehaviors> 
     <behavior name="serviceBehaviour"> 
      <serviceMetadata httpGetEnabled="true" httpGetUrl="http://192.168.1.2/Demo.Service/MultiEndPointsService.svc/basic"/>  
      <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
    </serviceBehaviors> 
</behaviors> 
4

Szukałem podejścia do ponownego użycia nagłówka hosta z żądania HTTP. Moim zdaniem powinno to działać zarówno w fazie rozwoju, jak i produkcji.

Okazuje się to tak proste, jak:

<behaviors> 
    <serviceBehaviors> 
     <behavior name="..."> 
     ... 
     <useRequestHeadersForMetadataAddress /> 
     </behavior> 
    </serviceBehaviors> 
</behaviors> 

ten sposób, jeśli punkt końcowy WSDL jest dostępny przez klienta to gwarantuje, że wszystkie związane z nimi zasoby WSDL/XSD będzie dostępna z tej samej bazy adresów URL.

+0

Dziękuję To działało dla mnie –

1

Można użyć gwiazdką * (wildcard) w miejsce localhost lub maszynowego nazwę w url bazowej tak:

<add baseAddress="net.tcp://*:4502/WxWcfService_01" /> 
Powiązane problemy