2009-05-16 8 views
33

Próbuję wdrożyć usługę WCF na mój serwer hostowany w IIS. Naturalnie to działa na moim komputerze :)Jak naprawić "nie można znaleźć adresu bazowego zgodnego ze schematem http" ... w WCF

Ale kiedy wdrożyć go, pojawia się następujący błąd:

This collection already contains an address with scheme http. There can be at most one address per scheme in this collection.

googlowania na to, uważam, że muszę umieścić element serviceHostingEnvironment do web.config plik:

<serviceHostingEnvironment> 
    <baseAddressPrefixFilters> 
    <add prefix="http://mywebsiteurl"/> 
    </baseAddressPrefixFilters> 
</serviceHostingEnvironment> 

Ale raz zrobiłem to, mam następujące:

Could not find a base address that matches scheme http for the endpoint with binding BasicHttpBinding. Registered base address schemes are [https].

Wygląda na to, że nie wie, jaki jest adres bazowy, ale jak to określić? Oto odnośny fragment mój plik web.config:

<system.serviceModel> 
    <serviceHostingEnvironment> 
    <baseAddressPrefixFilters> 
     <add prefix="http://mywebsiteurl"/> 
    </baseAddressPrefixFilters> 
    </serviceHostingEnvironment> 

    <behaviors> 
    <serviceBehaviors> 
     <behavior name="WcfPortalBehavior"> 
     <serviceMetadata httpGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 
    <bindings> 
    <basicHttpBinding> 
     <binding name="BasicHttpBinding_IWcfPortal" 
       maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" 
       receiveTimeout="00:10:00" sendTimeout="00:10:00" 
       openTimeout="00:10:00" closeTimeout="00:10:00"> 
     <readerQuotas maxBytesPerRead="2147483647" maxArrayLength="2147483647" 
       maxStringContentLength="2147483647"/> 
     </binding> 
    </basicHttpBinding> 
    </bindings> 

    <services> 
    <service behaviorConfiguration="WcfPortalBehavior" name="Csla.Server.Hosts.Silverlight.WcfPortal"> 
     <endpoint address="" binding="basicHttpBinding" contract="Csla.Server.Hosts.Silverlight.IWcfPortal" 
     bindingConfiguration="BasicHttpBinding_IWcfPortal"> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
    </service> 
    </services> 
</system.serviceModel> 

Czy ktoś może rzucić nieco światła na to, co się dzieje i jak to naprawić?

+0

hej Craig, czy ustalony ten problem? Proszę, pozwól mi ... Mam teraz do czynienia z tym samym problemem :( – Lamps

+0

wszelkie ostateczne rozwiązanie na ten temat? – Kiquenet

Odpowiedz

4

Czy twoja usługa IIS jest skonfigurowana tak, aby wymagać protokołu SSL podczas połączeń z Twoją witryną/aplikacją?

+0

Otrzymuję ten sam błąd, @tomasr i IIS jest skonfigurowany do wymagać SSL. Czy to będzie problem? Czy jest jakiś sposób dookoła tego? – StatsStudent

0

Jeśli jest hostowany w IIS, nie trzeba określać adresu bazowego, będzie to adres katalogu wirtualnego.

+0

następnie, jak rozwiązać problem OP?!? –

0

Powinny być sposoby na łatwe rozwiązanie tego problemu za pomocą zewnętrznych sekcji konfiguracji i dodatkowego kroku wdrażania, który powoduje przeniesienie określonego zewnętrznego pliku .config do znanej lokalizacji. Zwykle korzystamy z tego rozwiązania, aby obsługiwać różne konfiguracje serwerów dla różnych środowisk wdrażania (stopień zaawansowania, kontrola jakości, produkcja itp.), Przy czym domyślne jest pole "dev box", jeśli nie ma specjalnej kopii.

0

potwierdziła moje Fix:

W pliku web.config należy skonfigurować go jako taki wygląd:

<system.serviceModel > 
    <serviceHostingEnvironment configSource=".\Configurations\ServiceHosting.config" /> 
    ... 

Następnie zbudować strukturę folderów, który wygląda tak:

/web.config 
/Configurations/ServiceHosting.config 
/Configurations/Deploy/ServiceHosting.config 

Podstawowy plik serviceHosting.config powinien wyglądać następująco:

<?xml version="1.0"?> 
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"> 
    <baseAddressPrefixFilters> 
    </baseAddressPrefixFilters> 
</serviceHostingEnvironment> 

natomiast jeden w/deploy wygląda następująco:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true"> 
    <baseAddressPrefixFilters> 
     <add prefix="http://myappname.web707.discountasp.net"/> 
    </baseAddressPrefixFilters> 
</serviceHostingEnvironment> 

Poza tym, trzeba dodać ręcznej lub automatycznej etap wdrażania, aby skopiować plik z/Deploy overtop jednego w/Konfiguracje. Działa to niewiarygodnie dla adresu usługi i ciągów połączeń, a także oszczędza wysiłku, wykonując inne obejścia.

Jeśli nie podoba ci się to podejście (które dobrze pasuje do farmy, ale jest słabsze na pojedynczym komputerze), możesz rozważyć dodanie pliku web.config o jeden poziom wyżej od wdrożenia usługi na komputerze hosta i wstawienie Tutaj znajduje się węzeł serviceHostingEnvironment. Powinien się kaskadować.

4

Jeśli chcesz użyć baseAddressPrefixFilters w web.config, musisz również skonfigurować IIS (6). Pomogło mi to:

1/W IIS znajdź swoją witrynę. 2/Właściwości/Strona internetowa (zakładka)/Adres IP -> Przycisk zaawansowany 3/Dodaj nowy nagłówek hosta na tym samym porcie, którego użyjesz w pliku web.config.

37

Spróbuj zmienić tryb zabezpieczeń z "Transport" na "Brak".

 <!-- Transport security mode requires IIS to have a 
      certificate configured for SSL. See readme for 
      more information on how to set this up. --> 
     <security mode="None"> 
+0

Bardzo dobrze - Zmieniłem punkt końcowy z https na http tylko dla lokalnego debugowania i zapomniałem zmienić tryb bezpieczeństwa = "Transport" do trybu bezpieczeństwa = "Brak" . Naprawiony. – atconway

4

Musiałem zrobić dwie rzeczy do konfiguracji IIS witryny/aplikacji. Mój problem miał do czynienia z coraz Net.TCP pracy w IIS Web App strony:

pierwsze:

  1. prawym przyciskiem myszy na nazwę aplikacji IIS.
  2. Manage Web Site
  3. Ustawienia zaawansowane
  4. Set Włączone protokoły być "http, net.tcp"

drugie:

  1. W menu Actions po prawej stronie Menedżer, kliknij Wiązania ...
  2. Kliknij Dodaj
  3. Zmień typ na "net.tcp"
  4. Set wiążąca informacja do {numer}: otwarty port *
  5. OK
2

Tylko pierwsza baza adresów na liście zostaną przejęte (pochodzących z IIS). Nie można mieć wielu adresów bazowych na schemat przed .NET4.

1

Rozwiązaniem jest zdefiniowanie niestandardowego powiązania w pliku Web.Config i ustawienie trybu bezpieczeństwa na "Transport". Następnie wystarczy użyć właściwości bindingConfiguration wewnątrz definicji punktu końcowego, aby wskazać niestandardowe powiązanie.

Zobacz tutaj: Scott's Blog: WCF Bindings Needed For HTTPS