我正在设置一个如下所示的REST端点:
[WebInvoke(Method = "POST", UriTemplate = "?format=json", BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json)]
和
[WebInvoke(Method = "DELETE", UriTemplate = "?token={token}&format=json", ResponseFormat = WebMessageFormat.Json)]
以上引发了以下错误:
UriTemplateTable does not support '?format=json' and '?token={token}&format=json' since they are not equivalent, but cannot be disambiguated because they have equivalent paths and the same common literal values for the query string. See the documentation for UriTemplateTable for more detail.
我不是WCF的专家,但我想它应首先通过HTTP方法映射,然后通过URI模板映射。它似乎是倒退。如果我的两个URI模板都是:
?token={token}&format=json
这是有效的,因为它们是等效的,然后它看起来像HTTP方法,其中一个是POST而另一个是DELETE。
REST应该以这种方式工作吗?为什么URI模板表不是先由HTTP方法排序,而是由URI模板排序?当1个HTTP方法需要参数而另一个不需要时,或者如果我想要执行可选参数时(例如,如果未传递'format'参数,则默认为XML),这会导致严重的挫折。
答案 0 :(得分:1)
我认为这只是UriTemplateTable路由功能的限制。这不是REST问题,只是我担心的WCF。
您是否尝试过复制.Net 4.0中的错误?他们似乎已经做了很多工作来进一步支持.Net 4中的REST场景。
答案 1 :(得分:1)
要解决此问题,我必须使用POST方法执行以下操作:
[WebInvoke(Method = "POST", UriTemplate = "?token={token}&format=json", BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json)]
我的方法声明然后接受了一个名为'string token'的附加参数。然后我在我的方法中忽略'token'的值。如果客户端没有传递令牌的值,WCF会传递一个空字符串,但由于我没有使用它,所以没关系。
对于WCF 3.5来说,这仍然令人沮丧,但如果有其他人遇到此问题,这是一个很好的解决方法。