WCF Web API路由

时间:2011-12-10 08:39:24

标签: wcf rest

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

我正在尝试向我的应用程序添加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我会定义不同类型的路由,但我不确定如何在服务路由中这样做。

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

2 个答案:

答案 0 :(得分:1)

您是否曾尝试仅使用最后一种方法进行一些修改?

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

<强>更新

以下是我的代码中的示例,其中存在相同的命名操作,但具有不同的参数:

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

答案 1 :(得分:0)

我在这里解决了这个问题,这实际上是我自己缺乏理解,我假设方法名称是隐含的动作类型,即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)
        {