2010-04-20 38 views
1

我设立一个REST端点,看起来像下面这样:为什么WCF 3.5 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,另一个是删除。

REST是否应该这样工作?为什么URI模板表不是首先被HTTP方法和URI模板排序?当1个HTTP方法需要一个参数,另一个不需要,或者如果我想要做可选参数(例如'format'参数未被传递,默认为XML),这可能会导致一些严重的挫折。

+0

什么时候发生错误?在编译,启动和访问服务期间? – 2010-04-20 13:46:08

+0

访问服务。 – Brandon 2010-04-20 21:17:41

+0

使用什么访问?原始的HTTP请求(你自己构建它们,使用curl/whatever)?你不会碰巧使用Silverlight,是吗? – 2010-04-21 11:36:25

回答

1

为了解决这个问题,我不得不与我的POST方法如下:

[WebInvoke(Method = "POST", UriTemplate = "?token={token}&format=json", BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json)] 

我的方法声明,然后把在另一个名为'string token'的参数中。然后我忽略了我的方法中'token'的值。如果客户端没有为令牌传递值,WCF会传递一个空字符串,但由于我没有使用它,所以没关系。

这仍然令人沮丧的WCF 3.5,但它是一个很好的解决方法,如果有其他人遇到此问题。

+0

奇怪的看到最初的错误被称为'模糊'。你的解决方案现在更加模糊。谢谢MS! – ianbeks 2015-01-09 12:37:44

1

我相信这只是UriTemplateTable的路由功能的限制。这不是一个REST问题,只是我担心的一个WCF问题。

您是否尝试过在.Net 4.0中复制错误?他们似乎都做了相当多的工作,以进一步支持REST场景在.NET 4

+0

不幸的是,由于我公司的预算,我们将无法再访问.NET 4.0 4.0-8个月。 – Brandon 2010-04-21 12:58:19