API路由404如果可选参数错过
-
21-12-2019 - |
题
我在我的webapiconfig
中设置了该路由 public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
}
.
和这些方法在/api/productcontroller.cs中
public object GetProduct(int id)
{
var productRepo = new ProductRepository(db);
var product = productRepo.GetItem(id);
return product.ToAnonymousType();
}
public object GetTest()
{
var productRepo = new ProductRepository(this.db);
var product = productRepo.GetItem(10000);
return product.ToAnonymousType();
}
.
我可以请求/ api / product / getProduct / 10000并获得json返回。
如果我请求/ api / product / gettest,我得到404
如果我将gettest更改为
public object GetTest(int id)
.
和请求/ api / product / gettest / 10000我得到json。
我不知道为什么404正在发生。我有其他控制器(对于非API请求),它是正常处理请求的。经过多年的Webforms,我是MVC的新手,这让我难过。供参考,这是我的ruteconfig
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
.
和我的application_start
protected void Application_Start()
{
BundleConfig.RegisterBundles(BundleTable.Bundles);
RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.Register);
}
. 解决方案
这是由于路线的排序。
RouteConfig.RegisterRoutes(RouteTable.Routes);
.
在
之前调用GlobalConfiguration.Configure(WebApiConfig.Register);
.
和您的RegisterRoutes方法包含默认(非常通用)路由
url: "{controller}/{action}/{id}"
.
此通用(默认)规则将匹配
的URL模式api/product/gettest
.
在您的WebAPI路由将有机会匹配它。
如果不需要(并使用更多特定路由),或者只需将呼叫移动到
即可GlobalConfiguration.Configure(WebApiConfig.Register);
.
要在呼叫之前到
RouteConfig.RegisterRoutes(RouteTable.Routes);
.
在您的global.asax中。
我用你给出的所有信息建立了一个样本,并将呼叫转移工作得很好。 我希望这有助于帮助。
不隶属于 StackOverflow