获取请求正确解析我的控制器,但没有调用正确的(或任何)操作

时间:2012-08-27 16:48:02

标签: asp.net-mvc-routing asp.net-web-api

我有一个包含两个模型的网络项目 - IndicatorModelGranteeModel。我还为每个人提供了相应的ApiControllers - IndicatorsControllerGranteesController。我打算将这个设置用于我的实际web项目的数据API,所以我在我的项目中创建了一个名为“Api”的新区域。在我的ApiAreaRegistration课程中,我正在为这些控制器注册路径,如下所示:

context.Routes.MapHttpRoute(
  name: "ApiDefault",
  routeTemplate: "api/{controller}/{id}",
  defaults: new { id = RouteParameter.Optional }
);

基本上,对http://myapp/api/indicators/123的请求应该转到Indicators控制器,它应该由接受整数参数的action方法处理。我的控制器类设置如下,它完美地运行:

public class IndicatorsController : ApiController
{
    // get: /api/indicators/{id}
    public IndicatorModel Get(int id)
    {
        Indicator indicator = ...// find indicator by id
        if (indicator == null)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
        return new IndicatorModel(indicator);
    }
}

我的GranteesController课程设置相同:

public class GranteesController : ApiController
{
    // get: /api/grantees/{id}
    public GranteeModel Get(int granteeId)
    {
        Grantee grantee = ... // find grantee by Id
        if (grantee == null)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
        return new GranteeModel(grantee);
    }
}

现在出现问题 - 如果我向http://myapp/api/grantees/123尝试请求,我会得到一个404,并且我100%肯定404来自我的Get方法的。首先,我已尝试在该方法中进行调试和记录,并且该方法实际上从未被命中。此外,请求的实际输出(json)如下所示:

{ 
  "Message": "No HTTP resource was found that matches the request URI 'http://myapp/api/grantees/25'.",
  "MessageDetail": "No action was found on the controller 'Grantees' that matches the request."
}

此外,我的TraceWriter日志的输出如下所示:

;;http://myapp/api/grantees/10
DefaultHttpControllerSelector;SelectController;Route='controller:grantees,id:10'
DefaultHttpControllerSelector;SelectController;Grantees
HttpControllerDescriptor;CreateController;
DefaultHttpControllerActivator;Create;
DefaultHttpControllerActivator;Create;MyApp.Areas.Api.Controllers.GranteesController
HttpControllerDescriptor;CreateController;MyApp.Areas.Api.Controllers.GranteesController
GranteesController;ExecuteAsync;
ApiControllerActionSelector;SelectAction;
DefaultContentNegotiator;Negotiate;Type='HttpError', formatters=[JsonMediaTypeFormatterTracer...

因此我的请求正确路由 - 选择了正确的控制器,并正确设置了Id属性(10)。但是,ApiControllerActionSelector没有在控制器上找到匹配的方法。我也尝试将[HttpGet]属性添加到我的Get方法中,但没有成功。

有没有人对这里可能发生的事情有任何想法?我不能为我的生活弄清楚为什么动作选择器没有找到正确的动作。

1 个答案:

答案 0 :(得分:7)

GranteesController的操作上的参数名称需要从'granteeId'修改为'id':

public GranteeModel Get(int id