从Web API调用自定义方法

时间:2012-08-02 15:58:09

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

因此,我正在为WebAPI应用程序整理一个概念验证原型,并且所有常用方法都很有效。但我也想证明能够通过WebAPI调用自定义方法。所以我在RouteConfig.cs中有以下路由:

routes.MapHttpRoute(
               name: "ActionApi",
               routeTemplate: "api/{controller}/{action}/{id}",
               defaults: new { id = RouteParameter.Optional }
            );

在控制器中我有一个简单的方法:

[HttpGet]
public string Test()
{
    return "this is a string";
}

当我尝试调用我的方法时:http://localhost:43225/api/values/test我在浏览器中收到以下错误:

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">
The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.String Get(Int32)' in 'WebAPI_Listener.Controllers.ValuesController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
</string>

但是如果我在网址的末尾指定了一个ID,例如http://localhost:43225/api/values/test/1就可以了,即使该方法本身根本没有参数。

所以在路由中,如果我将id设置为可选,为什么当我没有指定{id}时它不起作用,但是如果我这样做的话,它确实有效,即使该方法本身不是期待{id} ??

1 个答案:

答案 0 :(得分:5)

您需要在〜/ App_Start / WebAPIConfig.cs Register方法中声明API路由。 WebAPIConfig中的catchall路由位于RouteConfig路由之前,因此您的路由永远不会被选中。

以下是向WebAPIConfig添加类似于您的路由的示例。这个例子有一个缺点:你必须明确说明匹配这条路由的控制器的HTTP动词(即〜/ api / values / get / 5而不是〜/ localhost:43225 / api / values / 5)。 / p>

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

为了避免这个缺点,您可以限制到给定控制器的路由,如下所示:

        config.Routes.MapHttpRoute(
            name: "ApiNonCrudActionsForMyController",
            routeTemplate: "MyController/{action}/{id}",
            defaults: new { controller = "MyController", id = RouteParameter.Optional }
        ); 

您还可以限制路径到控制器和操作,以保留标准动词,但如果您这么做,这可能会成为维护问题或混淆点。

        config.Routes.MapHttpRoute(
            name: "ApiNonCrudActionsForMyController",
            routeTemplate: "MyController/Test/{id}",
            defaults: new { controller = "MyController", action = "Test", id = RouteParameter.Optional }
        ); 

有关详细信息和其他一些方法,请查看以下内容:http://encosia.com/rest-vs-rpc-in-asp-net-web-api-who-cares-it-does-both/。您还可以考虑将操作限制为HTTP动词,并为自定义操作添加额外的控制器(即〜/ localhost:43225 / api / TestValues / 5)。