2012-08-02 80 views
0

因此,我为WebAPI应用程序构建了一个概念验证原型,所有常用方法都很好。但我也想演示如何通过WebAPI调用自定义方法。所以,我在我的RouteConfig.cs以下路由:从WebAPI调用自定义方法

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> 

但是,如果我指定的URL末尾的ID,如http://localhost:43225/api/values/test/1它的作品,即使方法本身不采取相提并论ameter。

所以在路由中,如果我将id设置为可选项,那么为什么当我不指定{id}时它不工作,但是如果我这样做了,那么即使方法本身不是'期待{id}?

回答

5

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

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

 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)。