5

我正在尝试将 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";
    }
}

我添加了一个类来注册 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 }
        );
    }
}

这是从 Application_Start 调用的

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

    WebApiConfig.Register(GlobalConfiguration.Configuration);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
}

但是,当我尝试访问 '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>

根据路由调试器,路由似乎工作正常,web api 路由是“匹配当前请求”的第一个条目。

4

4 回答 4

2

请参阅以下步骤 - 它可能不会给你一个正确的答案,但它会给你一个调试问题的方向。您可以一一执行这些操作。

  1. 确保您已执行以下操作:

    Install-Package Microsoft.AspNet.WebApi
    

这只是为了确保您拥有正确的 DLLS。

  1. 您可以尝试的另一件事是在 get 顶部添加一条路线。

    class ValuesController : ApiController
    { 
        [System.Web.Http.Route("api/values")]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }
    
        public string Get(int id)
        {
            return "value";
        }
    }
    
  2. 禁用 MvC 路由以进行调试。IE

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }
    
  3. 启用 GET 动词。

我在下面从我的项目中给你作为参考。

 <httpProtocol>
      <customHeaders>

        <add name="Access-Control-Allow-Headers" value="*" />
        <add name="Access-Control-Allow-Methods" value="*" />
      </customHeaders>
    </httpProtocol>
    <validation validateIntegratedModeConfiguration="false" />
    <handlers>
      <remove name="WebDAV" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
于 2014-09-14T05:47:20.137 回答
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";
        }
    }
}
于 2015-05-15T02:16:17.280 回答
1

确保您使用的是相同版本的

 System.Web.Http

当我从 ApiController System.Web.Http v5.0 继承 BaseApiController System.Web.Http v4.0 时遇到了这个错误

于 2014-08-14T15:45:34.790 回答
0

asp.net web api给了我同样的错误,但我用不同的方法和那个方法解决了这个问题;

第一种方法

我用 AclController 将控制器名称更改为 AuthorizeController 并解决了我的问题。

第二种方法

如果您将方法参数类型与字符串、int、bool 等类型一起使用,则此方法可能会解决您的问题,然后出现此错误并且不使用字符串、int、bool 等类型仅使用类或接口等类型,那么也许可以解决您的问题问题。

于 2017-03-16T13:24:46.290 回答