我最近问了一些关于创建网络API的最佳方法的问题,该网址使用与我的主要mvc网站相同的网址。我推断出最好的方法是对我的MVC网站进行必要的更改,以包含web api和必要的路由。
我主要关注How to add Web API to an existing ASP.NET MVC 4 Web Application project?,但我遇到了问题。代码编译很好,它显然正在寻找路线,但我收到错误:
未找到与请求URI“http://localhost:2242/api/value”匹配的HTTP资源。 未找到与名为“value”的控制器匹配的类型。
我的WebApiConfig:
class WebApiConfig
{
public static void Register(HttpConfiguration configuration)
{
configuration.Routes.MapHttpRoute("API Default", "api/{controller}/{id}",
new { id = RouteParameter.Optional });
}
}
我的global.asax:
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
Database.SetInitializer<ApplicationDbContext>(null);
}
}
我的api控制器:
public class ValuesController1 : ApiController
{
// GET api/<controller>
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET api/<controller>/5
public string Get(int id)
{
return "value";
}
// POST api/<controller>
public void Post([FromBody]string value)
{
}
// PUT api/<controller>/5
public void Put(int id, [FromBody]string value)
{
}
// DELETE api/<controller>/5
public void Delete(int id)
{
}
}
其他帖子证实这是一个正确且有效的设置...我创建了一个单独的webapi项目进行比较,这显然是正确的路由选择。最好将它构建到我的MVC网站,有没有人有任何想法?这张海报No type was found that matches controller有同样的问题,他找到的解决方案是将所有内容复制到一个新项目中....这不是我想做的事情/看我为什么需要这样做。
答案 0 :(得分:2)
我认为这是因为您的Controller名称:ValuesController1
控制器必须以“Controller”为后缀,1可能是您发出问题的原因。
答案 1 :(得分:1)
控制器ValuesController1
的名称与约定不匹配 - 为了使默认路由与/api/value
中的默认约定相匹配,configuration.Routes.MapHttpRoute(...)
,控制器应该被称为ValueController
:
public class ValueController : ApiController
{
public IEnumerable<string> Get()
// ...
但是,如果您打算偏离已配置的约定,则可以将RouteAttribute and RoutePrefixAttribute与Http*
谓词属性结合使用,以自定义控制器和方法路由,例如
[RoutePrefix("api/Foo")]
public class ValuesController : ApiController
{
// get api/Foo/value
[HttpGet]
[Route("value")]
public IEnumerable<string> NameDoesntMatter()
{
return new string[] { "value1", "value2" };
}
// get api/Foo/value/123
[HttpGet]
[Route("value/{id}")]
public string AnotherRandomName(int id)
{
return "value";
}
在使用RouteAttribute
之前,您需要将以下内容添加到WebApiConfig.Register(HttpConfiguration config)
:
config.MapHttpAttributeRoutes();
即使使用路由属性,请注意控制器类名称仍然需要以后缀Controller
结尾,即不能以后缀1
结尾。 It is surprisingly difficult改变这个惯例。