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