English 中文(简体)
在一个操作中设置多个HTTP方法?
原标题:
  • 时间:2009-02-16 23:49:32
  •  标签:

我有一个运营合同(如下),我希望允许针对其进行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);
最佳回答

这篇 MSDN 论坛上 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);
问题回答

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

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

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

有关MSDNJeff Barnes的信息。

针对上述问题,将Query_Get API中的WebInvoke更改为WebGet将解决该问题。

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

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





相关问题
热门标签