0

如何形成路由以在 ASP.Net Web API 中的不同控制器上使用相同的方法?

这是我尝试过的:

  var config = new HttpSelfHostConfiguration(strUrl);
           config.Routes.MapHttpRoute(
         "Scripts", "{controller}/{Name}",
         new { controller = "Scripts",strScriptId=""});


           config.Routes.MapHttpRoute(
            "Images", "{controller}/{strParam}",
            new { controller = "Images", strImageId= "" });

谢谢。

编辑:某种意义上的相同方法..例如,一种方法只接受一个参数,在两个控制器上具有不同的名称。

例子 :

  • ScriptsController 有 GetScripts(string strScriptId) 方法
  • ImagesController 有 GetImages(string strImageId) 方法。

我需要像访问它一样

 1. http://localhost/GetScripts/ScriptId123
 2. http://localhost/GetImages/ImageId223

我无法弄清楚这个路线。我已经尝试了上述路线(对其进行了编辑以使其更清晰。)

我有更多这样的控制器,它们具有不同的 getsomething 方法,只接受一个参数。

4

4 回答 4

2

您可能只有一条路线,如下所示:

config.Routes.MapHttpRoute("DefaultApi", "{controller}/{id}", new {id = RouteParameter.Optional});

你可以采取如下行动:

GetImages([FromUri(Name="id")] string strImageId);

GetScripts([FromUri(Name="id")] string strScriptId);
于 2013-06-24T17:26:37.500 回答
0

AS 我们都知道 REST 是基于资源的,这通过 URL 来识别资源,因此在 REST 服务中将允许不超过一个具有相同参数的方法,但在 MVC 5 Web Api 方法级路由中存在变通方法。

这是您可以执行此操作的示例:

[HttpGet]
[Route("api/search/FindByName/{name}")]
FindByName(string name)
{
}

[HttpGet]
[Route("api/search/FindById/{name}")]
FindById(int searchId)

注意:“search”是控制器名称。

如果需要更多说明,请告知。

于 2014-09-28T08:33:04.773 回答
0

有关路由选项,请参阅本教程

对于Id参数,它是最简单的。路由应该是:

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

和控制器方法(在哪个控制器上都没有关系!):

public MyData Get(int id)
{
    ...
}

如果你真的想要 Id 的字符串,你可以按如下方式使用它:

public MyData Get(string id)
{
    ...
}

你真的需要一个不同的参数名称吗?
如果这样做,您可以简单地尝试以下路由(不过我不确定):

routes.MapHttpRoute(
    name: "API Default",
    routeTemplate: "api/{controller}"
);

另请注意,您编写的路由路由在概念上对于 WebApis 是错误的:
而不是

  1. .../GetScripts/ScriptId123
  2. .../GetImages/ImageId223

考虑以下内容(对于 Get 请求):

  1. .../脚本/123
  2. .../图像/123
于 2013-06-24T15:52:07.037 回答
0

默认路由:

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

应该为你工作。确保您的操作方法与签名匹配(使用 id 而不是 strImageId 和 strScriptId)

编辑:

@Josh 路由中的参数应该与您的操作中的参数匹配。正如我之前所说,不需要创建备用路由,但如果您需要在 id 上保留这些名称,您可以创建一个路由来容纳它们:

routes.MapHttpRoute(
            name: "scriptsRoute",
            routeTemplate: "{controller}/{strScriptId}",
            defaults: new { controller="Scripts" }
        );

routes.MapHttpRoute(
            name: "imagesRoute",
            routeTemplate: "{controller}/{strImageId}",
            defaults: new { controller="Images" }
        );

注意,在上面的路线中,id 不是可选的,如果需要,您可以添加约束。此外,@liel 在命名控制器/动作方面的建议也是很好的建议。

于 2013-06-24T22:05:04.820 回答