在单个操作上启用多个HTTP方法?

时间:2009-02-16 23:49:33

标签: c# .net wcf web-services

我有一个操作合同(下面),我想允许GET和POST请求。如何告诉WCF接受单个OperationContract的两种类型的请求?

[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);

6 个答案:

答案 0 :(得分:18)

如果有人在寻找不同的解决方案,

[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.");
}

答案 1 :(得分:5)

MSDN Forums by Carlos Figueira上的帖子有一个解决方案。我现在就开始使用它,但如果其他人有任何更清洁的解决方案,请告诉我。

[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);

答案 2 :(得分:1)

您可能需要查看WebGetAttribute,我自己没有尝试过,但您可以将它与WebInvokeAttribute一起应用于同一方法。

有关MSDNJeff Barnes的信息。

答案 3 :(得分:1)

对于上述问题,在Query_Get API的情况下将WebInvoke更改为WebGet将解决此问题。

答案 4 :(得分:-1)

GET和POST意味着不同的行动。

这不会让客户感到困惑,从REST的角度来看是错误的吗?

答案 5 :(得分:-3)

不使用WebInvoke就可以了。

但这可能不是你正在寻找的答案。