2009-05-16 13 views
33

Ich versuche, einen WCF-Dienst auf meinem Server bereitzustellen, der in IIS gehostet wird. Natürlich funktioniert es auf meinem Rechner :)Wie zu beheben "konnte eine Basisadresse nicht finden, die Schema http entspricht ..." in WCF

Aber wenn ich es einsetzen, bekomme ich folgende Fehlermeldung:

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

auf diese googeln finde ich, dass ich ein servicehosting Element in die web.config setzen haben Datei:

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

Aber wenn ich dies getan habe, erhalte ich folgendes:

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

Es scheint, dass es nicht weiß, was die Basisadresse ist, aber wie kann ich es angeben? Hier ist der relevante Teil meiner Datei 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> 

Kann jemand etwas Licht auf, was los ist und wie man es beheben?

+0

hey craig, Sie dieses Problem behoben haben? Bitte lassen Sie mich ... Ich bin jetzt mit dem gleichen Problem konfrontiert :( – Lamps

+0

irgendwelche endgültige Lösung darüber? – Kiquenet

Antwort

4

Gibt es eine Chance, dass Ihr IIS so konfiguriert ist, dass SSL für Verbindungen zu Ihrer Site/Anwendung erforderlich ist?

+0

Ich bekomme den gleichen Fehler, @ Tomasr und IIS ist konfiguriert, SSL zu verlangen. Wird dies ein Problem sein? Gibt es eine Möglichkeit um diese? – StatsStudent

0

Wenn es in IIS gehostet wird, muss keine Basisadresse angegeben werden. Dies ist die Adresse des virtuellen Verzeichnisses.

+0

dann, wie das OP-Problem zu lösen ??!? –

0

Es sollte eine Möglichkeit geben, dies mit externen Konfigurationsabschnitten und einem zusätzlichen Implementierungsschritt, der eine deployment-spezifische externe .config-Datei an einen bekannten Speicherort ablegt, ziemlich einfach zu lösen. In der Regel verwenden wir diese Lösung, um die verschiedenen Serverkonfigurationen für unsere verschiedenen Implementierungsumgebungen (Staging, QA, Produktion usw.) zu handhaben, wobei unsere "dev box" die Standardeinstellung ist, wenn keine spezielle Kopie erfolgt.

0

meine fix Bestätigt:

In Ihrer web.config-Datei sollten Sie es so konfigurieren, als solche zu betrachten:

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

Dann eine Ordnerstruktur erstellen, die wie folgt aussieht:

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

Die Basis serviceHosting.config sollte so aussehen:

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

während derjenige in/Deploy sieht wie folgt aus:

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

Darüber hinaus benötigen Sie eine manuelle oder automatisierte Bereitstellung Schritt hinzufügen, um die Datei aus/Deploy overtop der in/Konfiguration zu kopieren. Das funktioniert unglaublich gut für Dienstadresse und Verbindungszeichenfolgen und spart Aufwand für andere Problemumgehungen.

Wenn Sie diesen Ansatz nicht mögen (der gut auf Farmen skaliert, aber auf einem einzelnen Computer schwächer ist), sollten Sie eine web.config-Datei mit einer höheren Ebene als die Servicebereitstellung auf dem Computer des Hosts hinzufügen serviceHostingEnvironment-Knoten dort. Es sollte für dich kaskadieren.

4

Wenn Sie baseAddressPrefixFilters in web.config verwenden möchten, müssen Sie auch IIS (6) einrichten. Das hat mir geholfen:

1/In IIS finden Sie Ihre Website. 2/Eigenschaften/Website (Registerkarte)/IP-Adresse -> Schaltfläche "Erweitert" 3/Fügen Sie einen neuen Host-Header für denselben Port hinzu, den Sie in web.config verwenden.

37

Versuchen Sie, den Sicherheitsmodus von "Transport" auf "None" zu ändern.

 <!-- 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

Sehr gut - Ich habe einen Endpunkt von https auf http nur für lokale Debugging geändert und vergessen, den Sicherheitsmodus = "Transport" in Sicherheitsmodus = "Keine" zu ändern . Fest. – atconway

4

Ich musste zwei Dinge mit der IIS-Konfiguration der Website/Anwendung tun. Mein Problem hatte mit immer net.tcp arbeitete in einer IIS-Website App zu tun:

Erstens:

  1. Rechtsklick auf dem IIS-App-Namen.
  2. Website verwalten
  3. Erweiterte Einstellungen
  4. Protokolle Set Enabled "http, net.tcp" sein

Zweitens:

  1. Unter dem Menü Aktionen auf der rechten Seite des Manager, klicken Sie auf Bindungen ...
  2. Klicken Sie auf Hinzufügen
  3. Ändern Sie den Typ zu "net.tcp"
  4. Sets Bindungsinformationen zu {open Portnummer}: *
  5. OK
2

Nur die erste Basisadresse in der Liste übernommen werden (von IIS kommen). Sie können nicht mehrere Basisadressen pro Schema vor .NET4 haben.

1

Die Lösung besteht darin, eine benutzerdefinierte Bindung innerhalb Ihrer Web.Config-Datei zu definieren und den Sicherheitsmodus auf "Transport" festzulegen. Dann müssen Sie die bindingConfiguration-Eigenschaft in Ihrer Endpunktdefinition nur verwenden, um auf Ihre benutzerdefinierte Bindung zu verweisen.

Siehe hier: Scott's Blog: WCF Bindings Needed For HTTPS

Verwandte Themen