2014-01-27 119 views
6

我有一个带有两个双ARGS一个Web API方法:为什么我的Web API方法没有调用双参数?

库接口:

public interface IInventoryItemRepository 
{ 
. . . 
    IEnumerable<InventoryItem> GetDepartmentRange(double deptBegin, double deptEnd); 
. . . 
} 

库:

public IEnumerable<InventoryItem> GetDepartmentRange(double deptBegin, double deptEnd) 
{ 
    // Break the doubles into their component parts: 
    int deptStartWhole = (int)Math.Truncate(deptBegin); 
    int startFraction = (int)((deptBegin - deptStartWhole) * 100); 
    int deptEndWhole = (int)Math.Truncate(deptEnd); 
    int endFraction = (int)((deptBegin - deptEndWhole) * 100); 

    return inventoryItems.Where(d => d.dept >= deptStartWhole).Where(e => e.subdept >= startFraction) 
     .Where(f => f.dept <= deptEndWhole).Where(g => g.subdept >= endFraction); 
} 

控制器:

[Route("api/InventoryItems/GetDeptRange/{BeginDept:double}/{EndDept:double}")] 
public IEnumerable<InventoryItem> GetInventoryByDeptRange(double BeginDept, double EndDept) 
{ 
    return _inventoryItemRepository.GetDepartmentRange(BeginDept, EndDept); 
} 

当我尝试调用此方法,通过:

http://localhost:28642/api/inventoryitems/GetDeptRange/1.1/99.99 

...我得到的,“HTTP错误404.0 - 找不到 您正在寻找已被删除的资源,有其名称更改,或者暂时不可用。

的相关方法运行正常(这个控制器的其他方法)。

回答

14

我能够重现这在我的机器上。

简单地增加一个/到URL的末尾纠正它我,貌似路由引擎浏览时为0.99文件扩展名,而不是输入参数。

http://localhost:28642/api/inventoryitems/GetDeptRange/1.1/99.99/ 

此外,它看起来像你可以注册自动添加一个尾部斜杠结束自定义路线的使用内置助手生成链接时的URL。我没有亲自测试: stackoverflow Add a trailing slash at the end of each url

最简单的解决方案是将下面的行添加到RouteCollection中。不知道你将如何与属性做到这一点,但在你的RouteConfig,你只补充一点:

routes.AppendTrailingSlash = true; 
+0

松了几个小时后很高兴找到答案! –

6

正如乔尔指出,这可能是IIS文件扩展名拾起,并试图成为一个静态文件。你可以解决这个问题通过添加以下到您的web.config文件(system.webServer下):

<modules> 
    <remove name="UrlRoutingModule-4.0" /> 
    <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" 
       preCondition="" /> 
</modules> 

默认情况下,IIS将只运行该模块它所认为是对ASP.NET资源的请求 - 在上面在每个站点基础上删除这个条件,允许您通过ASP.NET MVC/Web API路由路由所有请求。

如果静态文件存在,它仍然是首选,所以这不应该引起其他问题。

相关问题