在iis上的其他Web应用程序内部时,在WebAPI上接收404

时间:2016-06-28 22:11:33

标签: c# asp.net asp.net-mvc-4 iis asp.net-web-api

我创建了一个在IIS中托管的WebAPI(2.2)项目,以空白Web项目开始,然后添加了WebAPI控制器及其依赖项,这是一个非常简单的项目,有一个控制器和几个委派处理程序。

问题是,无论何时我将应用程序设置为自己的IIS网站(iis网站指向项目的根目录),或者将网站应用程序设置为没有应用程序的网站(例如inetpub \ wwwroot) API工作正常,但每当我尝试将其作为Web应用程序托管在其根目录下的应用程序的网站内时,对API的任何调用都会返回404 Not Found,并且IIS错误表明正在处理该调用即使我在web.config中为路径“*。”添加ExtensionlessUrlHandler,也可以使用“StaticFile”处理程序。

    + Sites
    |
    --+ WebApp1 (points to c:\apps\webapp1, a .Net web application)
      |
      --+MyAPI (ponts to c:\apps\MyAPI, the API in question) DOESN'T WORK
    |
    |
    --+ DEV (points to c:\inetpub\wwwroot, an empty folder)
      |
      --+MyAPIAgain (points to  c:\apps\MyAPI, the API in question) WORKS
    |
    |
    --+MyApiWebSite (points to  c:\apps\MyAPI, the API in question) WORKS

我已经做了一些关于这个问题的谷歌搜索,我发现的解决方案都归结为两个:在iis中注册.net(不是这种情况,因为api已经在一个设置中运行,这将阻止MyAPIAgain和MyApiWebSite来自工作)并使用web.config中的以下内容覆盖处理程序

  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <handlers>
      <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>

    <modules>
      <remove name="UrlRoutingModule-4.0" />
      <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />
    </modules>
  </system.webServer>

其中没有一个做过这个伎俩。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

使用以下标记包围root web.config文件的以下部分。 (不要为运行时 system.transactions configSections 部分执行此操作)这是适用的,您可能没有所有这些部分在你的web.config文件中。

<location path="." inheritInChildApplications="false">
   <appSettings>
      .....
   </appSettings>
</location>

<location path="." inheritInChildApplications="false">
   <system.web.webPages.razor>   
      .....
   </system.web.webPages.razor>
</location>

<location path="." inheritInChildApplications="false">
   <system.web>
      ......
   </system.web>
</location>

<location path="." inheritInChildApplications="false">
   <system.webServer>
     .....
   </system.webServer>
</location>

答案 1 :(得分:0)

请尝试这个,让我知道它是否适合你。

1)在App_Start文件夹中添加一个公共静态类,如下所述:

public static class WebApiConfig
{
    /// <summary>
    /// Registers the specified configuration.
    /// </summary>
    /// <param name="config">The configuration.</param>
    public static void Register(HttpConfiguration config)
    {
        var container = UnityConfig.GetConfiguredContainer();
        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
        //config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
        //config.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
    }
}

在routeTemplate中设置arg API文件夹的正确路径。

2)在global.asax.cs中添加一行(注意该行应放在RouteConfig之前):

GlobalConfiguration.Configure(WebApiConfig.Register);
RouteConfig.RegisterRoutes(RouteTable.Routes);

3)测试你的API。

问候。