Startfehler des WCF-Dienstes "Diese Sammlung enthält bereits eine Adresse mit dem Schema http"

182

Ich habe eine Webanwendung erstellt, die einen WCF-Servicevertrag und ein Silverlight-Steuerelement enthält, mit dem dieser WCF-Service aufgerufen wird. Auf meinen Entwicklungs- und Testservern funktioniert es hervorragend.

Wenn ich auf unserem Live-Server bereitstelle und die Anwendung ausführe, erhalte ich eine Ausnahme vom Typ, System.ServiceModel.ServiceActivationExceptiondie besagt, dass der Dienst aufgrund einer Ausnahme während der Kompilierung nicht aktiviert werden kann. Die Ausnahme ist:

Diese Sammlung enthält bereits eine Adresse mit dem Schema http. Diese Sammlung kann höchstens eine Adresse pro Schema enthalten.

Ich habe gelesen, dass diese Ausnahme ausgelöst werden kann, wenn die Website mehr als einen Host-Header enthält, was auf unserem Live-Server der Fall ist. Anscheinend können in IIS gehostete WCF-Dienste nur eine Basisadresse haben. Wie kann ich dieses Problem umgehen?

Jeremy
quelle

Antworten:

166

In .Net 4 können Sie die folgende multipleSiteBindingsEnabledOption verwenden:

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

Dann müssen Sie nicht jede Adresse angeben.

http://msdn.microsoft.com/en-us/library/system.servicemodel.servicehostingenvironment.multiplesitebindingsenabled.aspx

ericvg
quelle
Ja, aber dies funktioniert nur mit .NET 4.0 und höher. Dies kann mit .NET 2.0 / 3.0 / 3.5-Sites nicht verwendet werden.
Bytemaster
2
Hinweis - hier gibt es einen Tippfehler - es gibt kein Schließen>. Wenn Sie also kopieren und einfügen, haben Sie Probleme
Sydney
2
Bei dieser Frage funktioniert dies nicht: "Diese Funktionalität ist nur über das HTTP-Protokoll verfügbar."
George Tsiokos
146

Zusammenfassung,

Codelösung: Hier

Konfigurationslösungen: Hier

Mit Hilfe von Mike Chaliy habe ich einige Lösungen gefunden, wie dies durch Code gemacht werden kann. Da dieses Problem so gut wie alle Projekte betrifft, die wir in einer Live-Umgebung bereitstellen, habe ich mich für eine reine Konfigurationslösung entschieden. Ich habe schließlich eine gefunden, die ausführlich beschreibt, wie es in .net 3.0 und .net 3.5 geht.

Im Folgenden finden Sie ein Beispiel für die Änderung der Webkonfiguration Ihrer Anwendungen:

<system.serviceModel>
    <serviceHostingEnvironment>
        <baseAddressPrefixFilters>
            <add prefix="net.tcp://payroll.myorg.com:8000"/>
            <add prefix="http://shipping.myorg.com:9000"/>
        </baseAddressPrefixFilters>
    </serviceHostingEnvironment>
</system.serviceModel>

Im obigen Beispiel sind net.tcp: //payroll.myorg.com: 8000 und http://shipping.myorg.com:9000 die einzigen Basisadressen für ihre jeweiligen Schemata, die weitergeleitet werden dürfen. Der baseAddressPrefixFilter unterstützt keine Platzhalter.

Die von IIS bereitgestellten baseAddresses haben möglicherweise Adressen, die an andere Schemata gebunden sind, die in der baseAddressPrefixFilter-Liste nicht vorhanden sind. Diese Adressen werden nicht herausgefiltert.

DNS-Lösung (nicht getestet): Ich denke, wenn Sie einen neuen DNS-Eintrag speziell für Ihre Webanwendung erstellen, eine neue Website hinzufügen und ihm einen einzelnen Host-Header geben würden, der dem DNS-Eintrag entspricht, würden Sie dieses Problem insgesamt mindern und nicht Sie müssen benutzerdefinierten Code schreiben oder Ihrer web.config-Datei Präfixe hinzufügen.

Jeremy
quelle
2
Das Hinzufügen des Basisadressenpräfixfilters zur web.config hat einwandfrei funktioniert. Danke Jeremy!
Mike737
2
Ich kann mir keinen Grund
vorstellen,
42
Ich fange an, schlecht über WCF in Kombination mit ASP.net und Webdiensten nachzudenken, auf die über JavaScript zugegriffen wird. Ich hatte viel weniger Probleme mit einfachen alten ASMX-Diensten ...
Juri
Ok, was ist, wenn Sie eine Site mit einer Mischung aus .net 4- und .net 2-Anwendungen haben, die darunter ausgeführt werden? Die Basis der Anwendung ist .net4, und es gibt mehrere Anwendungen, für die .net2 erforderlich ist. Verwenden Sie <serviceHostingEnvironment multipleSiteBindingsEnabled = "true"> in allen .net4-Dateien und das Präfix in den .net 2-Anwendungen?
Travis
59

Haben Sie das gesehen - http://kb.discountasp.net/KB/a799/error-accessing-wcf-service-this-collection-already.aspx

Sie können diesen Fehler beheben, indem Sie die Datei web.config ändern.

Fügen Sie mit ASP.NET 4.0 die folgenden Zeilen zu Ihrer web.config hinzu:

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

Fügen Sie mit ASP.NET 2.0 / 3.0 / 3.5 die folgenden Zeilen zu Ihrer web.config hinzu:

<system.serviceModel> 
     <serviceHostingEnvironment> 
          <baseAddressPrefixFilters> 
               <add prefix="http://www.YourHostedDomainName.com"/> 
          </baseAddressPrefixFilters> 
     </serviceHostingEnvironment> 
</system.serviceModel> 
Mike Chaliy
quelle
Vielen Dank. Ich werde weiter suchen, um zu sehen, ob es eine Nicht-Code-Lösung gibt. Etwas, das in der Konfiguration durchgeführt werden kann, da dies Auswirkungen auf jedes Projekt hat, das wir durchführen. Ich hoffe, dass ich keinen benutzerdefinierten Code schreiben muss.
Jeremy
16

In meinem Fall waren die Hauptursache für dieses Problem mehrere http-Bindungen, die auf der übergeordneten Website definiert wurden, z. B. InetMgr-> Sites-> Mysite-> properties-> EditBindings. Ich habe eine http-Bindung gelöscht, die nicht erforderlich war, und das Problem wurde behoben.

Amar
quelle
1
Ja, Amar, das war sehr hilfreich - in meinem Fall war es eine andere Website mit mehreren Bindungen, die es kaputt gemacht hat. Extern auf demselben Computer verfügbar (jedoch mit einem anderen Hostnamen). Ebenso könnte dies durch Hinzufügen der Einstellung multipleSiteBindingsEnabled behoben werden, aber dann würde sich die web.config von allen anderen Umgebungen unterscheiden.
Der Coder
2
Es ist eine Schande, dass dies ganz unten ist. In unserem Fall hat dies für uns behoben.
brendonparker
Es hat mir geholfen, den Fehler in der Entwicklungsumgebung zu replizieren. Ich kann Website-Bindungen weder in Zertifizierungs- noch in Live-Umgebungen bearbeiten. Ich habe meine Hosts-Datei geändert, um eine Domain zu simulieren, und Bindungen zu lokalem IIS und bam hinzugefügt!
MFedatto
8

In meinem Fall war es ganz einfach: Ich habe den Assistenten zum Hinzufügen eines WCF-Dienstes in Visual Studio verwendet, der automatisch entsprechende Abschnitte in app.config erstellt hat. Dann las ich weiter : Gewusst wie: Hosten eines WCF-Dienstes in einer verwalteten Anwendung . Das Problem war: Ich musste die URL nicht angeben, um den Webdienst auszuführen.

Ersetzen:

using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))

Mit:

using (ServiceHost host = new ServiceHost(typeof(HelloWorldService))

Und der Fehler ist weg.

Generisches Idee: Wenn Sie die Basisadresse als param bieten und sie in Config angeben, können Sie diesen Fehler. Höchstwahrscheinlich ist das nicht der einzige Weg, um den Fehler zu bekommen, du.

bohdan_trotsenko
quelle
Mein Problem gelöst.
QShengyao
2

Ich hatte dieses Problem und die Ursache war ziemlich dumm. Ich habe die Microsoft-Demo zum Ausführen eines ServiceHost in einer ausführbaren Befehlszeilendatei ausprobiert. Ich habe die Anweisungen befolgt, einschließlich der Stelle, an der der entsprechende Dienst (und die entsprechende Schnittstelle) hinzugefügt werden sollen. Aber ich habe den obigen Fehler bekommen.

Es stellte sich heraus, dass VS beim Hinzufügen der Serviceklasse die Konfiguration automatisch zur app.config hinzugefügt hat. Und die Demo versuchte auch, diese Informationen hinzuzufügen. Da es bereits in der Konfiguration war, habe ich den Demo-Teil entfernt und es hat funktioniert.

Eric
quelle
0

Ich habe den gleichen Fehler auf einem alten 2010 Exchange Server festgestellt. Ein Dienst (Exchange-Postfachreplikationsdienst) hat den oben genannten Fehler ausgegeben, und der Migrationsprozess konnte nicht fortgesetzt werden. Beim Durchsuchen des Internets kam ich über diesen Link , der Folgendes angab:

Der Exchange GRE kann bei der erstmaligen Installation oder bei Änderungen am IIS-Server nicht geöffnet werden. Es schlägt mit einem Snap-In-Fehler fehl. Wenn Sie versuchen, die Snap-In-Seite zu öffnen, wird der folgende Inhalt angezeigt:

This collection already contains an address with scheme http.  There can be at most one address per scheme in this collection. If your service is being hosted in IIS you can fix the problem by setting 'system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled' to true or specifying 'system.serviceModel/serviceHostingEnvironment/baseAddressPrefixFilters'."

Ursache : Dieser Fehler tritt auf, weil der http-Port Nummer 443 bereits von einer anderen Anwendung verwendet wird und der IIS-Server nicht für die Verarbeitung mehrerer Bindungen an denselben Port konfiguriert ist.

Lösung : Konfigurieren Sie den IIS-Server für die Verarbeitung mehrerer Portbindungen. Wenden Sie sich an den Hersteller (Microsoft), um es zu konfigurieren.

Da diese Dienste von einem IIS-Webserver angeboten wurden, wurde das Problem durch Überprüfen der Bindungen auf der Stammwebsite behoben. Jemand hatte die Site-Bindungen durcheinander gebracht, Regeln definiert, die sich überlappten, und die Dienste durcheinander gebracht.

Das Beheben der richtigen Bindungen löste das Problem in meinem Fall und ich musste die Web.Config nicht konfigurieren.

jimas13
quelle