2009-02-16 2 views
8

Ich habe einen Betriebsvertrag (unten), den ich GET und POST-Anfragen gegen erlauben möchte. Wie kann ich WCF mitteilen, beide Arten von Anfragen für einen einzelnen OperationContract zu akzeptieren?Mehrere HTTP-Methoden für eine einzelne Operation aktivieren?

[OperationContract, 
WebInvoke(Method="POST", 
    BodyStyle = WebMessageBodyStyle.Bare, 
    RequestFormat = WebMessageFormat.Xml, 
    ResponseFormat = WebMessageFormat.Xml, 
    UriTemplate = "query")] 
XElement Query(string qry); 

[OperationContract, 
WebInvoke(Method="GET", 
    BodyStyle = WebMessageBodyStyle.Bare, 
    RequestFormat = WebMessageFormat.Xml, 
    ResponseFormat = WebMessageFormat.Xml, 
    UriTemplate = "query?query={qry}")] 
XElement Query(string qry); 

Antwort

5

Dieser Beitrag über die MSDN Forums by Carlos Figueira hat eine Lösung. Ich werde mit dem jetzt gehen, aber wenn jemand andere sauberere Lösungen hat, lass es mich wissen.

[OperationContract, 
WebInvoke(Method="POST", 
    BodyStyle = WebMessageBodyStyle.Bare, 
    RequestFormat = WebMessageFormat.Xml, 
    ResponseFormat = WebMessageFormat.Xml, 
    UriTemplate = "query")] 
XElement Query_Post(string qry); 

[OperationContract, 
WebInvoke(Method="GET", 
    BodyStyle = WebMessageBodyStyle.Bare, 
    RequestFormat = WebMessageFormat.Xml, 
    ResponseFormat = WebMessageFormat.Xml, 
    UriTemplate = "query?query={qry}")] 
XElement Query_Get(string qry); 
-3

Nicht WebInvoke wird den Trick tun.

Das ist jedoch nicht die Antwort, die Sie suchen.

+0

Was meinen Sie nicht mit webinvoke den Trick? –

1

Sie können einen Blick auf die WebGetAttribute nehmen wollen, ich habe es selbst nicht ausprobiert, aber Sie können in der Lage sein, es zusammen mit dem WebInvokeAttribute dem gleichen Verfahren anzuwenden.

Info über MSDN und Jeff Barnes.

+0

Es gibt keinen Unterschied zwischen WebInvoke (Method = "GET") und WebGet() –

1

Für das oben beschriebene Problem, das Ändern der WebInvoke zu WebGet im Falle von Query_Get API wird das Problem lösen.

+0

Es gibt keinen Unterschied zwischen WebInvoke (Methode = "GET") und WebGet() –

-1

GET und POST implizieren jedoch unterschiedliche Aktionen.

Ist dies nicht verwirrend für Kunden und falsch aus einer REST-Perspektive?

+1

Ich bin der Endpunkt basierend auf einer Spezifikation aus dem W3C . Diese Spezifikation beschreibt eine Methode, die mehrere Operationen (GET und POST) unterstützt. Wenn die Abfrage für eine GET-Anforderung (URL-Länge) zu groß ist, kann der Benutzer POST verwenden. –

18

Incase, wenn jemand eine andere Lösung suchen,

[OperationContract] 
[WebInvoke(Method="*")] 
public <> DoWork() 
{ 
    var method = WebOperationContext.Current.IncomingRequest.Method; 
    if (method == "POST") return DoPost(); 
    else if (method == "GET") return DoGet(); 
    throw new ArgumentException("Method is not supported."); 
} 
+0

Methode = "*" wird NICHT als gültig erkannt. Erlaubte Werte sind GET und POST. –

+0

Arbeitete für mich. Sparte mir viel Arbeit :) – batbaatar

+0

Es hat auch für mich funktioniert; aber ich konnte keine offizielle Dokumentation darüber finden, auch nicht hier https://msdn.microsoft.com/en-us/library/system.servicemodel.web.webinvokeattribute.method(v=vs.110).aspx weder hier noch https: //msdn.microsoft.com/en-us/library/system.servicemodel.web.webinvokeattribute%28v=vs.110%29.aspx – Giuseppe