WCF-Endpoint-Konfigurations-Fehler: Der 'Vertrag' - Attribut ist ungültig?
Ich habe einen WCF-service nennen wir es UserService
. Die UserService
hat einen Verweis auf eine Bibliothek-Klasse. Nennen wir es DoWork.dll
. Die DoWork.dll
hat ein WCF-Dienstverweis auf einen anderen service, wir rufen Sie CompanyService
.
Nun, wenn ich zuerst versucht, den Aufruf der UserService
ich würde einen Endpunkt nicht konfiguriert Fehlermeldung. Nach der Lektüre rund um das web habe ich gefunden, dass ich brauchen, um hinzuzufügen, die CompanyService
Bindungen und client-Informationen in die UserService
's web.config
unter der <system.serviceModel>
Knoten.
Hier ist es:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IComapnyService" />
</basicHttpBinding>
</bindings>
<client>
<endpoint name="BasicHttpBinding_ICompanyService"
address="http://it-dev.company.local:81/Project/Copmpany/CompanyService.svc"
binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IComapnyService"
contract="CompanyService.ICompanyService" />
</client>
Das problem, das ich habe, ist die contract="CompanyService.ICompanyService"
zeigt mir die Fehlermeldung:
Den 'Vertrag' - Attribut ist ungültig - Der Wert 'CompanyService.ICompanyService' ist ungültig gemäß seinem Datentyp 'clientContractType' - Die Enumeration-Einschränkung ist fehlgeschlagen.
Nun, wenn ich die CompanyService
beziehen sich direkt auf die UserService
WCF-Projekt, der Fehler geht Weg (offensichtlich). Aber ich sollte nicht haben, dies zu tun. Ich habe versucht, voll qualifizierten namespace der ICompanyService
Vertrag und das funktioniert auch nicht. Die ich gelöscht habe .suo-Datei und erstellen Sie das Projekt neu und das funktioniert auch nicht (schlug an anderer Stelle im web). Auch, wenn ich geben contract=
bekomme ich das drop-down-Liste, aber CompanyService.ICompanyService
ist nirgends zu finden (nur wenn ich mich auf den service direkt in die UserService
Projekt).
Ich habe versucht, konfigurieren Sie es mit Tools > WCF Service Configuration Editor
und das hilft nicht.
Ich sollte anmerken, dass alles scheint zu funktionieren, aber ich weiß nicht, wie die Tatsache, dass intellisense ist mir das blau squiggly underline und Fehlermeldung. Ich habe das Gefühl, ich brauche etwas anderes in der web.config
zu bekommen dies funktioniert, da die UserService
verweist auf die DoWork.dll
, die wiederum verweist auf die CompanyService
dessen Vertrag ich nicht richtig sehen.
Alle Vorschläge werden sehr geschätzt. Vielen Dank im Voraus.
- Ich stieß auf dieses vor kurzem und gefunden, dass tatsächlich die vollen namespace wurde ein Beitrag zu meinen Themen. Nützlicher Hinweis für alle anderen mit diesem problem.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du hast Recht - Sie sollten nicht haben, dies zu tun.
Die Architektur mit einem DLL - (DoWork.dll) mit einem "service reference" (ComanyService) ist schlecht. Es sei denn, die DLL ist hartcodiert die client-endpoint (im-code) zu nennen, die CompanyService für Sie, dann jemand mit der DLL haben, um zu versuchen und herauszufinden, wie konfigurieren Sie den client-Endpunkt für einen Dienst, den Sie nicht kennen. Das ist das, was Ihr im laufen in die.
Der Grund, warum dies funktioniert, wenn Sie einen Dienst hinzufügen Referenz direkt von Ihrem UserService ist, dass, wenn Sie dies tun, erhalten Sie eine Kopie der ServiceContract aus der CompanyService Metadaten. Um dies zu beweisen, suchen Sie in der Referenz.cs-Datei zu bekommen ist, erzeugt, Suche für CompanyService und Sie werden feststellen, es hat die [ServiceContract] - Attribut, bezeichnete es als WCF-Dienst. Darüber hinaus sehen Sie die [OperationContract] Attribute für die Methoden, plus [DataContracts] der Dienst meine auch tauschen. In anderen Worten, alle diese "Arten" haben in das Projekt importiert und beim kompilieren, WCF ist nun in der Lage zu finden diese Typen bei der Instanzierung des client-endpoint.
Wenn CompanyService ist eine Ihrer Dienstleistungen, dann betrachten Sie extrahieren aus dem ServiceContract-definition (Schnittstelle) in eine separate DLL. Dann können Sie auf diese Typen als "assembly-Referenzen" aus dem Dienst (CompanyService) und beliebigen client-Anwendungen, wie UserService. Zumindest auf diesem Weg bist du nicht, dass Sie eine service-Referenz. Aber Sie haben noch zu füllen die .... Abschnitt in Ihrer Anwendung für einen service, den Sie technisch vielleicht nicht wissen, die details. Nicht der beste Ansatz.
Einen besseren Ansatz, um die service-Abhängigkeit aus der DoWork.dll. Man könnte dies nur durch das verschieben der Logik in der UserService Implementierung.
Oder, wenn Sie brauchen, um zu halten DoWork.dll unabhängig sind, dann wrappen DoWork mit es auf WCF-Dienst, der eine Abhängigkeit von der CompanyService. Dann, von UserService, einen Dienstverweis hinzufügen der neuen DoWork-service. Dies ist mehr im Einklang mit den Mietern von SOA und ermöglicht mit Ihren Dienstleistungen entwickeln sich unabhängig voneinander.