我创建了一个在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>
其中没有一个做过这个伎俩。有什么想法吗?
答案 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。
问候。