调用 WebAPI 2 控制器时出现 404
404 when WebAPI 2 Controller is called
我开发了一个简单的 WebAPI 2 控制器,它只有一个控制器和一些简单的 GET 方法。我为此创建了一个 Visual Studio 2015 Emtpy ASP.Net Web 应用程序并向其中添加了一个 WebAPI 2 控制器。
我已将其发布到安装了 IIS 8.5 和 ASP.Net 4.0 的 Windows 2012 R2 机器上。它有最新的更新等
当我从浏览器调用方法时出现错误 404 - 0x80070002 通知:MapRequestHandler
您可以在这里下载我的解决方案:VS2015 WebAPI2 Solution
这是错误信息:
这是我的网络应用程序:
这些是处理程序:
这是 WebApplication 配置:
这是应用程序池配置:
这些是 ISAPI 过滤器:
有人知道它不起作用的可能原因吗?
这是我的控制器:
using System.Collections.Generic;
using System.Web.Http;
namespace WebApi2Routes1.Controllers
{
// [Controller wird api/Default in diesem Fall genommen, also Controller Name ohne 'Controller'
[RoutePrefix("api/[controller]")]
public class BuecherController : ApiController
{
// GET: api/buecher/default
// [HttpGet]
[Route("")]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET: api/buecher/show
[Route("show")]
public string Show()
{
return "Show";
}
[Route("value/{id:int}")]
public string GetValue(int id)
{
return "value" + id.ToString();
}
}
}
这是我的web.config
<?xml version="1.0" encoding="utf-8"?>
<!--
Weitere Informationen zum Konfigurieren Ihrer ASP.NET-Anwendung finden Sie unter
http://go.microsoft.com/fwlink/?LinkId=301879
-->
<configuration>
<appSettings></appSettings>
<system.web>
<compilation debug="true" targetFramework="4.5.2"/>
<httpRuntime targetFramework="4.5.2"/>
</system.web>
<system.webServer>
<modules>
<remove name="UrlRoutingModule-4.0" />
<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />
</modules>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0"/>
<remove name="OPTIONSVerbHandler"/>
<remove name="TRACEVerbHandler"/>
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler"
preCondition="integratedMode,runtimeVersionv4.0"/>
</handlers>
</system.webServer>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs"
type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701"/>
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb"
type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+"/>
</compilers>
</system.codedom>
</configuration>
我这是抛出错误的url:
http://localhost:8080/api/buecher
和
http://localhost:8080/api/buecher/show
更新 1:
我也有一个global.asax
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Routing;
namespace WebApi2Routes1
{
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
}
}
}
和一个WebApiConfig.cs
using Newtonsoft.Json.Serialization;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http.Formatting;
using System.Web.Http;
namespace WebApi2Routes1
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web-API-Konfiguration und -Dienste
// Web-API-Routen
config.MapHttpAttributeRoutes();
// var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
// jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
}
}
}
自行解决。有两个问题:
[RoutePrefix("api/[controller]")]
[controller] 作为令牌是行不通的!您必须将其替换为静态字符串,例如 "books" 或其他任何内容。
第二个问题是方法需要明确的 HHTTPGET 或 HTTPPOST 等。这不起作用
[Route("show")]
public string Show()
{
return "Show";
}
这个有效
[Route("show")]
[HttpGet]
public string show()
{
return "Show";
}
仅当方法本身被调用时 Get() 或 Post() 或 ...不需要 [HttpGet].
用静态值替换 RoutePrefix 中的 [controller] 标记并将 [HTTPGET] 添加到它起作用的方法后!
我开发了一个简单的 WebAPI 2 控制器,它只有一个控制器和一些简单的 GET 方法。我为此创建了一个 Visual Studio 2015 Emtpy ASP.Net Web 应用程序并向其中添加了一个 WebAPI 2 控制器。
我已将其发布到安装了 IIS 8.5 和 ASP.Net 4.0 的 Windows 2012 R2 机器上。它有最新的更新等
当我从浏览器调用方法时出现错误 404 - 0x80070002 通知:MapRequestHandler
您可以在这里下载我的解决方案:VS2015 WebAPI2 Solution
这是错误信息:
这是我的网络应用程序:
这些是处理程序:
这是 WebApplication 配置:
这是应用程序池配置:
这些是 ISAPI 过滤器:
有人知道它不起作用的可能原因吗?
这是我的控制器:
using System.Collections.Generic;
using System.Web.Http;
namespace WebApi2Routes1.Controllers
{
// [Controller wird api/Default in diesem Fall genommen, also Controller Name ohne 'Controller'
[RoutePrefix("api/[controller]")]
public class BuecherController : ApiController
{
// GET: api/buecher/default
// [HttpGet]
[Route("")]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET: api/buecher/show
[Route("show")]
public string Show()
{
return "Show";
}
[Route("value/{id:int}")]
public string GetValue(int id)
{
return "value" + id.ToString();
}
}
}
这是我的web.config
<?xml version="1.0" encoding="utf-8"?>
<!--
Weitere Informationen zum Konfigurieren Ihrer ASP.NET-Anwendung finden Sie unter
http://go.microsoft.com/fwlink/?LinkId=301879
-->
<configuration>
<appSettings></appSettings>
<system.web>
<compilation debug="true" targetFramework="4.5.2"/>
<httpRuntime targetFramework="4.5.2"/>
</system.web>
<system.webServer>
<modules>
<remove name="UrlRoutingModule-4.0" />
<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />
</modules>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0"/>
<remove name="OPTIONSVerbHandler"/>
<remove name="TRACEVerbHandler"/>
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler"
preCondition="integratedMode,runtimeVersionv4.0"/>
</handlers>
</system.webServer>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs"
type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701"/>
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb"
type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+"/>
</compilers>
</system.codedom>
</configuration>
我这是抛出错误的url:
http://localhost:8080/api/buecher
和
http://localhost:8080/api/buecher/show
更新 1:
我也有一个global.asax
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Routing;
namespace WebApi2Routes1
{
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
}
}
}
和一个WebApiConfig.cs
using Newtonsoft.Json.Serialization;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http.Formatting;
using System.Web.Http;
namespace WebApi2Routes1
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web-API-Konfiguration und -Dienste
// Web-API-Routen
config.MapHttpAttributeRoutes();
// var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
// jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
}
}
}
自行解决。有两个问题:
[RoutePrefix("api/[controller]")]
[controller] 作为令牌是行不通的!您必须将其替换为静态字符串,例如 "books" 或其他任何内容。
第二个问题是方法需要明确的 HHTTPGET 或 HTTPPOST 等。这不起作用
[Route("show")]
public string Show()
{
return "Show";
}
这个有效
[Route("show")]
[HttpGet]
public string show()
{
return "Show";
}
仅当方法本身被调用时 Get() 或 Post() 或 ...不需要 [HttpGet].
用静态值替换 RoutePrefix 中的 [controller] 标记并将 [HTTPGET] 添加到它起作用的方法后!