Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC路由问题_C#_Asp.net_Asp.net Mvc_Asp.net Web Api_Asp.net Mvc Routing - Fatal编程技术网

C# MVC路由问题

C# MVC路由问题,c#,asp.net,asp.net-mvc,asp.net-web-api,asp.net-mvc-routing,C#,Asp.net,Asp.net Mvc,Asp.net Web Api,Asp.net Mvc Routing,尽管阅读了大量关于MVC路由的博客和教程,但还是很难掌握MVC路由 我有这个webapi函数: public HttpResponseMessage UpsertProducts([FromUri] int marketplaceId, [FromUri] int datasourceId, [FromBody]List<HeisenbergProduct> heisenbergProducts) public HttpResponseMessage ReviseInventory

尽管阅读了大量关于MVC路由的博客和教程,但还是很难掌握MVC路由

我有这个webapi函数:

public HttpResponseMessage UpsertProducts([FromUri] int marketplaceId, [FromUri] int datasourceId, [FromBody]List<HeisenbergProduct> heisenbergProducts)
public HttpResponseMessage ReviseInventory([FromUri] int marketplaceId, [FromUri] int datasourceId, [FromBody]List<HeisenbergReviseInventory> heisenbergReviseInventories)
一切都很好

我现在添加了另一个函数:

public HttpResponseMessage UpsertProducts([FromUri] int marketplaceId, [FromUri] int datasourceId, [FromBody]List<HeisenbergProduct> heisenbergProducts)
public HttpResponseMessage ReviseInventory([FromUri] int marketplaceId, [FromUri] int datasourceId, [FromBody]List<HeisenbergReviseInventory> heisenbergReviseInventories)
我试图通过使用属性路由绕过这个问题:

[Route("/api/WebApiProducts/upsertproducts/{marketplaceid}/{datasourceid}")]
public HttpResponseMessage UpsertProducts([FromUri] int marketplaceId, [FromUri] int datasourceId, [FromBody]List<HeisenbergProduct> heisenbergProducts)

您显示的路由配置是针对MVC而不是web api的。查找将为Web API设置路由的
WebApiConfig.cs
文件

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

你是对的-我添加了错误的配置文件contect-我更新了问题以获得正确的数据。但是使用我的查询字符串参数仍然存在问题。我已经设法通过改变我正在呼叫的URL使它工作-我想你可以两种方式都做。看我的answer@Rick. 它们可以双向工作。映射路线的顺序很重要,因为第一条路线匹配的路线将获胜,更具体的路线将首先映射,更一般的路线将随后映射。您需要通过将最后一个映射上移1来切换顺序。它没有到达第二条基于约定的路线,因为它已经与第一条路线匹配。谢谢,是的,您的订购是正确的-我忘了。我更改了顺序,并尝试使用querystring方法调用,但仍然不起作用。我似乎仍然不得不使用我在回答中提出的方法。
config.MapHttpAttributeRoutes();
string.Format("api/webapiproducts/reviseinventory/{0}/{1}", marketplaceId, datasourceId);