我在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)
和request / api / product / gettest / 10000我得到JSON。
我不知道404为什么会这样。我有正常处理请求的其他控制器(用于非api请求)。经过几年的网络形式,我是MVC的新手,这让我很难过。作为参考,这里是我的RouteConfig
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);
}
答案 0 :(得分:2)
这是由于您的路线排序。
RouteConfig.RegisterRoutes(RouteTable.Routes);
在之前调用
GlobalConfiguration.Configure(WebApiConfig.Register);
并且您的RegisterRoutes方法包含默认(非常通用)路径
url: "{controller}/{action}/{id}"
此通用(默认)规则将匹配您的网址格式
api/product/gettest
在您的WebAPI路线有机会匹配之前。
如果不需要(并使用更具体的路线),您可以摆脱超级通用路线,或者只是将呼叫转移到
GlobalConfiguration.Configure(WebApiConfig.Register);
来电话之前
RouteConfig.RegisterRoutes(RouteTable.Routes);
在你的Global.asax中。
我使用您提供的所有信息构建了一个示例,并且移动该调用的工作正常。 我希望这会有所帮助。