如何获取Web API属性路由工作

时间:2016-10-18 23:53:38

标签: asp.net-web-api

我已向ASP.NET MVC应用添加了Web API功能,并希望使用属性路由。在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之后查看GlobalConfigurationConfiguration._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>

1 个答案:

答案 0 :(得分:1)

据我所知,如果它在你的IIS上运行不正常,那就是IIS错误,而不是ASP.NET错误,所以这实际上不是来自ASP.NET的路由引擎,而是来自IIS处理无表达式URL。

您可以尝试将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

希望这有帮助!