2010-06-03 13 views
44

Ich entwickle einige RESTful-Dienste in WCF 4.0. Ich habe, wie unten ein Verfahren bekommt:Optionale Abfragezeichenfolgeparameter in URITemplate in WCF?

[OperationContract] 
    [WebGet(UriTemplate = "Test?format=XML&records={records}", ResponseFormat=WebMessageFormat.Xml)] 
    public string TestXml(string records) 
    { 
     return "Hello XML"; 
    } 

Also, wenn ich zu http://localhost:8000/Service/Test?format=XML&records=10 meinen Browser navigieren, dann funktioniert alles wie exepcted.

JEDOCH möchte ich in der Lage sein, zu http://localhost:8000/Service/Test?format=XML zu navigieren und den "& records = 10" Teil der URL wegzulassen. Aber jetzt erhalte ich einen Dienstfehler, da der URI nicht mit der erwarteten URI-Vorlage übereinstimmt.

Also wie implementiere ich Standardwerte für einige meiner Abfragezeichenfolgenparameter? Ich möchte die "records" beispielsweise auf 10 setzen, wenn dieser Teil von der Abfragezeichenfolge weggelassen wird.

Antwort

53

Hinweis: Diese Frage ist veraltet, bitte lesen Sie die anderen Antworten.


Dies wird nicht unterstützt.

Jedoch hat Microsoft dieses Problem bekannt gemacht worden und es gibt eine Behelfslösung:

Sie können den gewünschten Effekt durch Weglassen der Abfrage-String aus dem UriTemplate auf Ihrem WebGet oder bekommen WebInvoke Attribut und verwenden WebOperationContext.Current.InquiringRequest.UriTemplateMatch.QueryParameters von innerhalb Ihrer Handler zu prüfen, Standardeinstellungen, etc. auf die Abfrage Parameter.

https://connect.microsoft.com/VisualStudio/feedback/details/451296/

+1

Damit gut zu funktionieren scheint. Wenn ich jedoch versuche, den Komponententest auszuführen, funktioniert es nicht mehr, da ein Komponententest keinen WebOperationContext hat. Ich habe ein paar Beispiele gesucht, aber hat jemand ein einfaches Beispiel dafür, wie man den WebOperationContext überspitzt? – Shafique

+0

Probieren Sie Googlen "Mock WebOperationContext". Es gibt viele verschiedene Ideen, wie man das macht. – luksan

+0

Gib dem Mann +1, seine Lösung funktioniert! Hier fange ich an. – EdgarVerona

4

Check nach Blog aus. Für mich sinnvoll, und kommt mit einer Klasse, um die Parameter der Abfragezeichenfolge zu analysieren.

http://blogs.msdn.com/b/rjacobs/archive/2009/02/10/ambiguous-uritemplates-query-parameters-and-integration-testing.aspx

Grundsätzlich definieren nicht die Query-String-Parameter in der UriTemplate so dass es mit/ohne die Parameter übereinstimmt, und die Probe-Klasse verwenden, um sie zu holen, wenn sie in der Methodenimplementierung da sind.

16

Nach this answer ist dies in .NET 4.0 behoben. Wenn der Abfragezeichenfolgenparameter nicht angegeben wird, wird der Standardwert für den Typ angegeben.

2

Dies scheint in WCF 4.0 zu arbeiten.
So stellen Sie sicher, dass Ihr Standardwert in Ihrem „Service1.svc.cs“

public string TestXml(string records) 
{ 
    if (records == null) 
     records = "10"; 

    //... rest of the code 
} 
setzen