AddServiceEndpoint throws Schlüssel ist Null?

8

Wenn ich den ServiceHost.AddServiceEndpoint zum Hinzufügen des benutzerdefinierten ProtoEndpointBehavior verwende, erhalte ich die folgende Ausnahme:

  

System.ArgumentNullException: Der Wert darf nicht null sein. Parametername:   Schlüssel bei System.Collections.Generic.Dictionary 2.FindEntry(TKey key) at System.Collections.Generic.Dictionary 2.ContainsKey (TKey-Schlüssel) um   System.ServiceModel.ServiceHostBase.ImplementedContractsContractResolver.ResolveContract (String   Vertragsname) at   System.ServiceModel.ServiceHostBase.ServiceAndBehaviorsContractResolver.ResolveContract (String   Vertragsname) at   System.ServiceModel.Description.ConfigLoader.LookupContractForStandardEndpoint (String   Vertragsname, String serviceName) um   System.ServiceModel.Description.ConfigLoader.LookupContract (Zeichenfolge   Vertragsname, String serviceName) um   System.ServiceModel.ServiceHostBase.AddServiceEndpoint (ServiceEndpoint   Endpunkt) um   My.Service.Business.ServiceHandler.StartService (Geben Sie serviceType,   Zeichenfolge uri, SecureConnectionSettings secureConnectionSettings) in   C: \ Meine \ Produkte \ Meine   Utveckling \ Solution \ My.Service.Business \ ServiceHandler.cs: Zeile 150

So sieht der Code aus:

%Vor%

Ich verwende dies in der Konfigurationsdatei wie folgt:

%Vor%

Jetzt muss ich es stattdessen in Code hinzufügen.

Was ist los?

    
Banshee 19.02.2017, 13:47
quelle

2 Antworten

4

Es ist ein bekannter Fehler und es gibt Workaround dafür.

Wenn Instanz von Contract zu erhalten, verwenden statische Methode ContractDescription.GetContract (Typ ) statt direkter Contract () Konstruktor:

%Vor%

Ich war in der Lage, Ihr Problem zu reproduzieren und diese Abhilfe für mich gearbeitet.

    
CodeFuller 27.02.2017, 05:34
quelle
1

Der Grund für die Ausnahme liegt darin, dass ServiceEndpoint davon ausgegangen hat, dass Sie die Konfigurationsdatei verwenden. Es versucht, & amp; Lösen Sie Ihren Vertrag, Bindung und Adresse, die nicht existiert, weil Sie nicht die Konfigurationsdatei verwenden.

ServiceEndpoint (siehe Anmerkungen)

  

Verwenden Sie diesen Konstruktor, wenn die Bindung und Adresse für den Endpunkt sind   in der Konfiguration bereitgestellt.

Es gibt zahlreiche Möglichkeiten, create or zu erstellen Rufen Sie ein ContractDescription Objekt ab:

%Vor%

Wenn Sie wirklich darauf bestehen, ContractDescription programmatisch zu erstellen, müssen Sie einige der folgenden Dinge definieren:

  • Vertragsbeschreibung
  • OperationBeschreibung
  • Nachrichtenbeschreibung
  • OperationBehaviorAttribute
  • Und andere Sachen ...

Oder Sie können diesem Blog folgen als Kicker.

Haben Sie CodeFuller's Antwort versucht? Seine Antwort könnte Ihr Leben leichter machen. Ich habe einen schnellen Check gemacht und es funktioniert.

%Vor%

Leider konnte ich kein Bild anhängen "etwas stimmt nicht mit imgur" , aber es funktioniert auf meinem Webbrowser. Obwohl ich nicht mit Client-App getestet habe, aber ich denke, Sie sind bereits in der Nähe der Lösung.

Tipp: Konfigurationsdatei und Code dürfen nicht gemischt werden, da dies sehr schwierig ist. "Was Sie wahrscheinlich wussten" Viel Glück:)

    
jtabuloc 28.02.2017 18:07
quelle

Tags und Links