WCF WebAPI路由

问题描述:

这可能是一个愚蠢的问题..但到底是什么,我有点难倒和沮丧。WCF WebAPI路由

我正在尝试向我的应用程序添加一个REST服务。我想支持两种具有可选参数的GET类型。

在全球ascx我有;

routes.Add(new ServiceRoute("api/userstats", new HttpServiceHostFactory() { Configuration = config }, typeof(RESTService.APIs.UserStatsAPI))); 

然后在那个控制器中我有;

[WebGet(UriTemplate = "{userguid}")] 
    public IQueryable<UserStat> Get(string userguid) 
    { 
     return null; 
    } 

    [WebGet(UriTemplate = "{userguid}/{genericstatid}")] 
    public IQueryable<UserStat> Get(string userguid, int genericstatid) 
    { 
     return null; 
    } 

所以,基本上你可以查询一个用户的所有统计数据,或者只是一个特定类型的统计数据。当我尝试运行该应用时,它会抱怨,因为我有两个GET定义。

不能有两个操作在具有相同名称相同的合同,

我可以理解为什么,但我不知道如何解决它。如果是MVC,我会定义不同类型的路由,但我不确定如何在服务路由中完成此操作。

感谢您的任何帮助。我要去喝杯咖啡,看看是否有帮助。

我解决了这个问题在这里,这实际上是我自己的缺乏理解,我认为方法名称是隐含的行动类型,即一个webget必须被称为GET。事实并非如此,只要你有WebGet,你可以调用方法名称来改变参数,就像上面Alexander的例子一样。我的下面;

[WebGet(UriTemplate = "{userid}")] 
     public IQueryable<UserStat> Get(int userid) 
     { 

[WebGet(UriTemplate = "{userid}/{genericstatid}")] 
     public IQueryable<UserStat> GetWithID(int userid, int? genericstatid) 
     { 

您是否试过只留下最后一种方法进行修改?

[WebGet(UriTemplate = "{userguid}/{genericstatid}")] 
public IQueryable<UserStat> Get(string userguid, int? genericstatid) 
{ 
    if (genericstatid.HasValue) 
    { 
     // looking at one 
    } 
    else 
    { 
     // looking at all. 
    } 
    return null; 
} 

UPDATE:

这里是我的代码,其中有一个同名操作的例子,但使用不同的参数:

/// <summary> 
    /// Gets the javascript representation of important enumerations 
    /// </summary> 
    /// <returns></returns> 
    [OperationContract, WebGet(UriTemplate = "get/javascriptEnums.js")] 
    Stream GetEnumsJavascriptRegistration(); 

    /// <summary> 
    /// Gets some file from server 
    /// </summary> 
    /// <param name="fileName">The name of the file to return</param> 
    /// <returns></returns> 
    [OperationContract, WebGet(UriTemplate = "get/{*fileName}")] 
    Stream Get(string fileName); 
+0

这是一个很好的观点!我现在就放弃它。回来一秒钟。 :) – philbird

+0

这似乎不起作用,因为它期望至少有两个参数,所以它提供了一个404.我认为可能为操作添加一个名称,但我还没有发现。也许我应该使用参数而不是ID ......但对我来说这似乎是一个常见的要求,所以很奇怪,它证明如此困难。 – philbird

+0

我用我的项目中的代码更新了答案 –