如何在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= "" });
感谢。
编辑:在某种意义上的方法相同......例如,在两个控制器上只接受一个不同名称的参数的方法。
示例:
我需要像
一样访问它 1. http://localhost/GetScripts/ScriptId123
2. http://localhost/GetImages/ImageId223
我无法弄清楚这条路线。我已经尝试了上述路线(编辑它们以使其更清晰。)
我还有更多这样的控制器,其中不同的getsomething方法只接受一个参数。
答案 0 :(得分:2)
您可以只使用下面的一条路线:
config.Routes.MapHttpRoute("DefaultApi", "{controller}/{id}", new {id = RouteParameter.Optional});
您可以执行以下操作:
GetImages([FromUri(Name="id")] string strImageId);
GetScripts([FromUri(Name="id")] string strScriptId);
答案 1 :(得分:0)
请参阅this tutorial了解路由选项。
对于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概念上是错误的:
而不是
考虑以下内容(For Get requests):
答案 2 :(得分: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" }
);
请注意在ids上方的路线中不是可选的,您可以根据需要添加约束。 @liel在命名控制器/操作方面的建议也是很好的建议。
答案 3 :(得分: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)
注意:“搜索”是控制器名称。
如果需要更多说明,请告知。