it-swarm.com.de

Optionale Abfragezeichenfolgeparameter in URITemplate in WCF?

Ich entwickle einige RESTful-Dienste in WCF 4.0. Ich habe eine Methode wie folgt:

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

Wenn ich also mit meinem Browser zu http: // localhost: 8000/Service/Test? Format = XML & records = 10 navigiere, funktioniert alles wie erwartet.

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

Wie implementiere ich also Standards für einige meiner Abfragezeichenfolgeparameter? Ich möchte die "Datensätze" beispielsweise auf 10 setzen, wenn dieser Teil in der Abfragezeichenfolge nicht angegeben ist.

44
Shafique

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


Dies scheint nicht unterstützt zu werden. 

Microsoft wurde jedoch auf dieses Problem aufmerksam gemacht und es gibt eine Problemumgehung:

Den gewünschten Effekt erhalten Sie mit die Abfragezeichenfolge aus der .__ weglassen. UriTemplate in Ihrem WebGet oder WebInvoke-Attribut und Verwendung von WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters von Ihren Handlern aus zu überprüfen, Standardwerte usw. für die Abfrage festlegen Parameter.

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

53
luksan

Laut dieser Antwort ist dies in .NET 4.0 behoben. Wenn der Parameter für die Abfragezeichenfolge nicht angegeben wird, wird anscheinend der Standardwert für den Typ angegeben.

16
Olly

Überprüfen Sie diesen Blogbeitrag. Ist für mich sinnvoll und wird mit einer Klasse geliefert, um die Abfragezeichenfolgeparameter zu analysieren.

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

Definieren Sie die Abfragezeichenfolgeparameter im UriTemplate grundsätzlich nicht, sodass sie mit/ohne die Parameter übereinstimmen, und verwenden Sie die Beispielklasse, um sie abzurufen, wenn sie in der Methodenimplementierung vorhanden sind.

4
MonkeyWrench

Ja, ich kann nach WCF 4.0 bestätigen, dass es wie hier beschrieben funktioniert: WCF und optionale Parameter

3
JOKe

Dies scheint in WCF 4.0 zu funktionieren.
Stellen Sie sicher, dass Sie Ihren Standardwert in "Service1.svc.cs" festlegen.

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

  //... rest of the code
}
2
Navy Seal

Obwohl dies eine alte Frage ist, kommen wir in aktuellen Projekten immer wieder zu diesem Szenario. 

Um optionale Abfrageparameter zu senden, habe ich das Paket WCF Web Extensions nuget erstellt.

Nach der Installation können Sie das Paket folgendermaßen verwenden:

using (var factory = new WebChannelFactory<IQueryParametersTestService>(new WebHttpBinding()))
{
    factory.Endpoint.Address = new EndpointAddress(ServiceUri);
    factory.Endpoint.EndpointBehaviors.Add(new QueryParametersServiceBehavior());
    using (var client = factory.CreateWebChannel())
    {
        client.AddQueryParameter("format", "xml");
        client.AddQueryParameter("version", "2");
        var result = client.Channel.GetReport();
    }
}

Serverseitig können Sie die Parameter mit WebOperationContext abrufen:

WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters;
0
Cosmin Vană