MVC 路由问题
MVC routing troubles
尽管阅读了大量关于 MVC 路由的博客和教程,但在掌握 MVC 路由方面确实遇到了困难...
我有这个 webapi 函数:
public HttpResponseMessage UpsertProducts([FromUri] int marketplaceId, [FromUri] int datasourceId, [FromBody]List<HeisenbergProduct> heisenbergProducts)
和Route.config
中的默认路由:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
一切正常。
我现在添加了另一个功能:
public HttpResponseMessage ReviseInventory([FromUri] int marketplaceId, [FromUri] int datasourceId, [FromBody]List<HeisenbergReviseInventory> heisenbergReviseInventories)
尽管动作名称不同,但似乎存在冲突,当调用它们中的任何一个时,我得到一个 500 internal server error
- 我猜它不知道使用哪个。
我用 URL:
给他们打电话
api/webapiproducts/upsertproducts?marketplaceId={0}&datasourceId={1}
我试图通过使用属性路由来解决这个问题:
[Route("/api/WebApiProducts/upsertproducts/{marketplaceid}/{datasourceid}")]
public HttpResponseMessage UpsertProducts([FromUri] int marketplaceId, [FromUri] int datasourceId, [FromBody]List<HeisenbergProduct> heisenbergProducts)
和
[Route("/api/WebApiProducts/reviseinventory/{marketplaceid}/{datasourceid}")]
public HttpResponseMessage ReviseInventory([FromUri] int marketplaceId, [FromUri] int datasourceId, [FromBody]List<HeisenbergReviseInventory> heisenbergReviseInventories)
我的路由属性似乎都不起作用。我做错了什么,我对这里的路由有什么不了解?
正如@Nkosi 所指出的,我放错了路由文件!这是我的 WebApiConfig.cs 内容:
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DefaultActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
您显示的路由配置适用于 MVC 而不是 Web api。查找 WebApiConfig.cs
文件,该文件将为 Web API
设置路由
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Attribute routing.
config.MapHttpAttributeRoutes();
// Convention-based routing.
config.Routes.MapHttpRoute(
name: "DefaultActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
默认的基于约定的路由设置通常如下所示
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
没有操作占位符,这会导致您的路由冲突。
要启用属性路由,请执行此操作
config.MapHttpAttributeRoutes();
更新 WebApiConfig
以包含正确的设置应该可以解决基于约定和属性路由的问题。
通过更改 URL 我正在为此调用:
设法让它与属性路由一起工作
string.Format("api/webapiproducts/reviseinventory/{0}/{1}", marketplaceId, datasourceId);
尽管阅读了大量关于 MVC 路由的博客和教程,但在掌握 MVC 路由方面确实遇到了困难...
我有这个 webapi 函数:
public HttpResponseMessage UpsertProducts([FromUri] int marketplaceId, [FromUri] int datasourceId, [FromBody]List<HeisenbergProduct> heisenbergProducts)
和Route.config
中的默认路由:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
一切正常。
我现在添加了另一个功能:
public HttpResponseMessage ReviseInventory([FromUri] int marketplaceId, [FromUri] int datasourceId, [FromBody]List<HeisenbergReviseInventory> heisenbergReviseInventories)
尽管动作名称不同,但似乎存在冲突,当调用它们中的任何一个时,我得到一个 500 internal server error
- 我猜它不知道使用哪个。
我用 URL:
给他们打电话api/webapiproducts/upsertproducts?marketplaceId={0}&datasourceId={1}
我试图通过使用属性路由来解决这个问题:
[Route("/api/WebApiProducts/upsertproducts/{marketplaceid}/{datasourceid}")]
public HttpResponseMessage UpsertProducts([FromUri] int marketplaceId, [FromUri] int datasourceId, [FromBody]List<HeisenbergProduct> heisenbergProducts)
和
[Route("/api/WebApiProducts/reviseinventory/{marketplaceid}/{datasourceid}")]
public HttpResponseMessage ReviseInventory([FromUri] int marketplaceId, [FromUri] int datasourceId, [FromBody]List<HeisenbergReviseInventory> heisenbergReviseInventories)
我的路由属性似乎都不起作用。我做错了什么,我对这里的路由有什么不了解?
正如@Nkosi 所指出的,我放错了路由文件!这是我的 WebApiConfig.cs 内容:
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DefaultActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
您显示的路由配置适用于 MVC 而不是 Web api。查找 WebApiConfig.cs
文件,该文件将为 Web API
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Attribute routing.
config.MapHttpAttributeRoutes();
// Convention-based routing.
config.Routes.MapHttpRoute(
name: "DefaultActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
默认的基于约定的路由设置通常如下所示
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
没有操作占位符,这会导致您的路由冲突。
要启用属性路由,请执行此操作
config.MapHttpAttributeRoutes();
更新 WebApiConfig
以包含正确的设置应该可以解决基于约定和属性路由的问题。
通过更改 URL 我正在为此调用:
设法让它与属性路由一起工作string.Format("api/webapiproducts/reviseinventory/{0}/{1}", marketplaceId, datasourceId);