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);
这是一个很好的观点!我现在就放弃它。回来一秒钟。 :) – philbird
这似乎不起作用,因为它期望至少有两个参数,所以它提供了一个404.我认为可能为操作添加一个名称,但我还没有发现。也许我应该使用参数而不是ID ......但对我来说这似乎是一个常见的要求,所以很奇怪,它证明如此困难。 – philbird
我用我的项目中的代码更新了答案 –