【问题标题】:How To Get Web API Attribute Routing Working如何让 Web API 属性路由工作
【发布时间】:2016-10-18 23:53:37
【问题描述】:

我已将 Web API 功能添加到 ASP.NET MVC 应用程序并希望使用属性路由。在 Visual Studio 2015 中运行该站点时,我可以在浏览器地址栏中输入 URL 并让我的控制器上的方法工作。将站点移至 IIS 后,我得到的只是 404 响应。我尝试了很多代码更改,但都没有成功。

BuilderApiController 文件位于 WebAPI/v1/Controllers 文件夹中。控制器上的属性会在这里找到吗?

namespace Hds.Edsi.WebAPI.V1.Controllers
{
    [System.Web.Http.RoutePrefix("api/v1/builder")]
    public class BuilderApiController : BaseApiController
    {
        [System.Web.Http.Route("GetExternalOrganizationID/{envisionOrgID}")]
        [System.Web.Http.HttpGet]
        public HttpResponseMessage GetExternalOrganizationID(string envisionOrgID)
        {

WebApiConfig.cs 文件。标准的东西。如果我使用属性路由,我需要config.Routes.MapHttpRoute 部分吗?我试过有无。

如果我需要,config.MapHttpAttributeRoutes() 的目的是什么?当我在调用 Register 后查看GlobalConfiguration,Configuration._routes 时,没有任何属性路由定义的路由存在。他们应该是吗?

namespace Hds.Edsi.WebAPI
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API routes
            config.MapHttpAttributeRoutes();

            /*
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/v1/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
            */

protected void Application_Start()
{
    GlobalConfiguration.Configure(WebApiConfig.Register);
    AreaRegistration.RegisterAllAreas();
    GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
    GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new StringEnumConverter());
    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);

    Components.Automapper.CreateMaps();

    // Requrired for managing AppDomain teardown - IRegisteredObject
    MonitorManager.RegisterInstance();
}

IIS Express:

http://localhost:8181/api/v1/builder/GetExternalOrganizationID/123.123.123.123.1234 如我所料返回一个 JSON 对象。

IIS:

http://my server/api/v1/builder/GetExternalOrganizationID/123.123.123.123.1234 返回 404

我猜我在这里遗漏了一些简单的东西,或者不明白属性路由的工作原理。

已添加

这是来自 web.config 的 system.webServer 部分:

  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true">
      <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" />
      <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" preCondition="managedHandler" />
      <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" preCondition="managedHandler" />
    </modules>
  <handlers>
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*" verb="*" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />

    <remove name="OPTIONSVerbHandler" />
    <remove name="TRACEVerbHandler" />
  </handlers>
  </system.webServer>

【问题讨论】:

    标签: asp.net-web-api


    【解决方案1】:

    据我所知,如果它在您的 IIS 上无法正常工作,那么这是一个 IIS 错误,而不是 ASP.NET 错误,所以这实际上不是来自 ASP.NET 的路由引擎,而是来自 IIS 对无表情的处理网址。

    您可以尝试将runAllManagedModulesForAllRequests 添加到您的web.config

    <system.webServer>
         <modules runAllManagedModulesForAllRequests="true">
            <add name="ScriptCompressionModule" type="Westwind.Web.ScriptCompressionModule,Westwind.Web" />
          </modules>
    </system.webServer> 
    

    详细可以参考 Rick Strahl 的网络日志ASP.NET Routing not working on IIS 7.0

    希望这会有所帮助!

    【讨论】:

    • 我从 web.config 添加了 system.webServer 部分。根据您链接到的文章,似乎还可以。
    • 那么,什么?这现在有效还是有同样的问题
    • 在 URL 上加上一个正斜杠,这一切都按预期工作。参数中的点导致 IIS 尝试映射到不存在的文件,因此 404。末尾的正斜杠让 IIS 知道这不是特定文件,因此路由工作。
    猜你喜欢
    • 2015-02-14
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 2017-09-19
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    相关资源
    最近更新 更多