Ich habe eine Umgebung, in der mehrere Websites, die auf demselben Server gehostet werden, einen einzigen Dienst verwenden, um Anrufe zu tätigen. Zum Beispiel:
Die Api-Anwendung wurde als virtuelles Verzeichnis in jeder Site eingerichtet, die demselben physischen Verzeichnis zugeordnet ist, so dass die Quelle nur an einer Stelle liegt. Das Problem besteht darin, dass WCF nicht gerne mehrere Basisadressen für seine Dienstendpunkte hat. Damit der Dienst überhaupt funktioniert, musste ich einen Basis-Adresspräfix-Filter hinzufügen:
%Vor%Dies funktioniert jedoch nur für domain1, weil Sie nur einen baseAddressPrefixFilter haben dürfen (sie sollten es nicht baseAddressPrefixFilter s nennen, wenn Sie nur einen haben dürfen). Ich habe versucht, eine benutzerdefinierte ServiceHostFactory zu erstellen, um es zu umgehen, aber ich laufe auf das Filterproblem, bevor die ServiceHostFactory im Aktivierungsprozess aufgerufen wird.
Irgendwelche Ideen, wie man einen einzigen Dienst für 2 Domains wie diesen bekommt?
Ok, die ganze URL in die Endpunktadresse zu setzen war etwas, an das ich nicht gedacht hatte, das bringt mich irgendwohin. Nach der Verwendung der benutzerdefinierten ServiceHostFactory, die für Domäne1, aber nicht für Domäne2 funktionierte. Ich habe eine neue Fehlermeldung erhalten, die ich noch nicht gesehen habe:
"Keine Protokollbindung stimmt mit der angegebenen Adresse Ссылка " überein. Protokollbindungen werden auf Site-Ebene in konfiguriert IIS- oder WAS-Konfiguration. "
Aktualisierung:
Ok, ich habe es herausgefunden (endlich!). Ich kann der Service-Definition einen Host-Knoten hinzufügen und die Verwendung absoluter URLs in jedem Endpunkt vermeiden. Ich habe auch BaseAddressPrefixFilter entfernt, aber die benutzerdefinierte ServiceHostFactory in der Lösung beibehalten.
%Vor%Ich war besorgt, dass ich für jede Bindung einen Endpunkt für jede Domäne schreiben müsste, der viel zu viel Konfigurationsaufwand hätte. Diese Lösung ist großartig, weil ich das nicht tun muss, es ist ein wenig prägnanter.
Zur Referenz: Hier ist meine ServiceHostFactory-Klasse. Es ist ziemlich einfach, aber es ist erforderlich. Sobald Sie dies haben, müssen Sie auch das Markup Ihrer .svc-Datei ändern, um Factory: Factory="Api.ServiceHostFactory"
einzuschließen %Vor%IIRC, du kannst verschiedene Präfixe haben - aber nur eines pro Protokoll -, also könntest du ein tcp-Präfix und vielleicht ein https-Präfix haben (musst das überprüfen). Sie sollten jedoch auch die vollständige Adresse des Dienstes angeben können, anstatt die Basisadresse und den relativen Anteil zu verwenden. Möglicherweise benötigen Sie jedoch mehrere Endpunkte.