Kann ein WCF-service-Vertrag haben, eine null-input-parameter?
Ich habe einen Vertrag wie folgt definiert:
[OperationContract]
[WebGet(UriTemplate = "/GetX?myStr={myStr}&myX={myX}", BodyStyle = WebMessageBodyStyle.Wrapped)]
string GetX(string myStr, int? myX);
Bekomme ich auch eine exception:
[InvalidOperationException: der Vorgang 'GetX' im Vertrag 'IMyGet' hat ein query-variable mit dem Namen 'myX' des Typs 'System.Nullable1[System.Int32]', but type 'System.Nullable
1[System.Int32] " nicht Cabrio von 'QueryStringConverter'. Variablen für UriTemplate-Abfrage müssen die Werte haben Typen, die umgewandelt werden können, indem 'QueryStringConverter'.]
konnte nicht finden, alles, was zu diesem Fehler, außer den folgenden link:
http://blog.rolpdog.com/2007/07/webget-and-webinvoke-rock.html , die ein wenig alt und nicht eine Lösung irgendwie.
irgendwelche Ideen was zu tun, außer loszuwerden, die nullable-parameter?
Dank.
InformationsquelleAutor Ami | 2009-09-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, Sie können nullable-Parameter mit WCF. Ich glaube, dein problem hier ist, dass QueryStringConverter funktioniert nicht mit nullable-Parametern.
Was ist zu tun? Tun Sie verwenden müssen, um die UriTemplate-Attribut? Wenn Sie die Veröffentlichung dieser wie eine klassische web-service', dann würden Sie nicht dieses Problem haben.
Die andere option ist, Folgen Sie den Rat in dem link, den Sie - d.h. Sie erhalten die myX-parameter als string und dann warf es in einen int?, wo (sagen wir) "n" null ist. Nicht schön.
InformationsquelleAutor Kirk Broadhurst
Gibt es eine Lösung für dieses problem, die nicht benötigt keine hacks. Es sieht vielleicht aus wie eine Menge Arbeit, aber es ist nicht wirklich und macht eine Menge Sinn, wenn Sie Lesen, durch. Der Kern des Problems ist, dass es ist in der Tat ein ungelöste Fehler (ab .NET 4) das bedeutet, dass die WebServiceHost nicht verwenden benutzerdefinierte QueryStringConverters. So müssen Sie ein wenig zusätzliche Arbeit und verstehen, wie die WCF-Konfiguration für WebHttpEndpoints funktioniert. Die unten legt die Lösung für Sie.
Erste, eine benutzerdefinierte QueryStringConverter erlaubt null-Werte in den query-string durch weglassen, oder eine leere Zeichenfolge:
Nun eine benutzerdefinierte "WebHttpBehavior", legen Sie die benutzerdefinierte QueryStringConverter verwendet werden, anstelle der standard. Beachten Sie, dass dieses Verhalten derivces von "WebHttpBehavior" das ist wichtig, damit wir Erben des Verhaltens erforderlich, für einen REST-Endpunkt:
Nun eine benutzerdefinierte ServiceHost fügt hinzu, dass die benutzerdefiniertes Verhalten der WebHttpEndpoint, so dass die benutzerdefinierte QueryStringConverter. Die wichtige Sache zu beachten in diesem code ist, dass es leitet sich von ServiceHost und NICHT WebServiceHost. Dies ist wichtig, da ansonsten die Fehler, die oben erwähnt wird verhindern, dass die benutzerdefinierte QueryStringConverter verwendet werden:
Weil wir sind nicht der Ableitung von WebServiceHost wir müssen es tun, die Arbeit und stellen sicher, dass unsere Konfiguration korrekt ist, um sicherzustellen, der REST Dienst zu arbeiten. Etwas wie das folgende ist alles, was Sie brauchen. In dieser Konfiguration, ich habe auch ein WS HTTP-endpoint-setup, weil ich brauchte, um Zugang zu diesem service von C# (mit WS HTTP als seine nicer) und mobile Geräte (mit REST). Können Sie weglassen der Konfiguration für diesen Endpunkt, wenn Sie es nicht brauchen. Eine wichtige Sache zu beachten ist, dass Sie müssen NICHT die benutzerdefinierten Endpunkt Verhalten mehr. Dies ist, weil wir jetzt das hinzufügen unserer eigenen Endpunkt Verhalten, bindet die benutzerdefinierte QueryStringConverter. Es leitet sich aus "WebHttpBehavior" das ist, was die Konfiguration Hinzugefügt, so dass es nun überflüssig.
Das Letzte, was zu tun ist, erstellen Sie eine benutzerdefinierte ServiceHostFactory und sagen Sie die svc-Datei zu verwenden, die dazu führen, dass alle benutzerdefinierten code verwendet werden. Natürlich können Sie auch erstellen Sie ein benutzerdefiniertes element, das es erlauben würde, die Sie hinzufügen, um das Verhalten in der Konfiguration, aber ich denke, für dieses Verhalten eine code-basierten Ansatz ist besser, da ist es unwahrscheinlich, dass Sie möchten, entfernen Sie die Fähigkeit zur Verarbeitung von nullable-Typen, wie es bricht Ihr service:
Ändern Sie den Wert von Ihrem Service.svc-Datei wie folgt:
Jetzt können Sie verwenden von auf null festlegbaren Typen in Ihrem service-Schnittstelle, ohne Probleme, einfach durch weglassen der parameter oder die Einstellung ein leerer string ist. Die folgenden Ressourcen können von mehr Unterstützung für Sie:
Hoffe, das hilft!
Das ist eine Hölle der eine Menge Arbeit für etwas, das sollte schon ein nobrainer implementieren von Microsoft.
Was für eine überraschung, macht Microsoft etwas, das sollte einfach sein in etwas schmerzhaft über kompliziert... Gute Antwort, aber
ich habe erstellt eine Bibliothek und fügte hinzu, diese 4 class-Dateien , und bezeichnet alle die entsprechenden namespaces, und gab auch, dass " lib " dll-Verweis auf die wcfservice Anwendung, aber immer noch der gleiche Fehler zeigt.. was ich m fehlt pls alle die mir helfen..
Wow. Vielen Dank für diese Lösung. Nicht natürlich, kann sein dass seltsam
InformationsquelleAutor Xcalibur
Tatsächlich...Sie können absolut müssen nullable-Parameter, oder jede andere Art von parameter wird nicht unterstützt von
QueryStringConverter
aus der box. Alles, was Sie tun müssen, ist zu erweiternQueryStringConverter
zu unterstützen, was Sie brauchen würde. Finden Sie die akzeptierten Antworten in diesem post ==>In das WCF-Programmiermodell, wie kann man das schreiben ein Vorgang Vertrag mit einer Reihe von query-string-Parametern (d.h. mit dem gleichen Namen)?
InformationsquelleAutor WayneC
Summen, die schnelle Lösung (nicht schön) zu akzeptieren, die nullable-parameter als Zeichenfolge in der WCF jeweiligen Schnittstelle und der Service-codes.
InformationsquelleAutor wolf354