ASP.NET Web API错误:找不到与请求URI匹配的HTTP资源

igo*_*ork 5 asp.net-mvc asp.net-web-api

我试图将Web API添加到现有的ASP.NET MVC项目中。这最初是一个ASP.NET MVC 2网站,后来使用以下过程将其升级到MVC 3,然后再升级到MVC 4:

将ASP.NET MVC 2项目升级到ASP.NET MVC 3

将ASP.NET MVC 3项目升级到ASP.NET MVC 4

我的Api控制器非常简单。实际上,这是默认模板:

public class ValuesController : ApiController
{
    // GET api/values
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/values/5
    public string Get(int id)
    {
        return "value";
    }
}
Run Code Online (Sandbox Code Playgroud)

我添加了一个类来注册de API路由。

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

从Application_Start调用

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    WebApiConfig.Register(GlobalConfiguration.Configuration);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试访问“ localhost:50315 / api / values”时,出现以下错误:

<Error>
<Message>
    No HTTP resource was found that matches the request URI    'http://localhost:50315/api/values'.
</Message>
<MessageDetail>
    No type was found that matches the controller named 'values'.
</MessageDetail>
</Error>
Run Code Online (Sandbox Code Playgroud)

根据路由调试器的说法,该路由似乎运行正常,Web api路由是“匹配当前请求”的第一个条目。

igo*_*ork 2

解决方案是为 apicontroller 类提供不同的命名空间,就像 AardVark71 在评论中的建议一样。

现有的 MVC 有一个类似于 WebApplication.Controllers 的命名空间,并且 Web api 使用相同的命名空间。当我改变它时,一切正常。

完整的 Web Api 控制器如下所示:

namespace WebApplication.Api.Controllers
{
    public class ValuesController : ApiController
    {
        // GET api/values
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET api/values/5
        public string Get(int id)
        {
            return "value";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)