访问 Web API 2 服务时出现 404 错误
404 Error when accessing Web API 2 service
我有一个 WebAPI2 Web 服务,可以在我的开发站点和本地临时站点上运行,但是当我推送到生产环境时,我在尝试访问相同的服务时遇到 404 错误。
这是问题的一个例子...
// production server returns 404 Error
http://my.servername.com/AppAPI/CustomerAPI/Session/4
// local stage site works
http://localhost:100/AppAPI/CustomerAPI/Session/4
我知道导致 404 的原因有很多。首先想到的是糟糕的路线,这似乎是我在研究中看到的大多数 404 问题的根源。如控制器代码所示,我正在使用 WebAPI 2 属性路由...
public class SessionController : ApiController
{
[Route("CustomerAPI/Session/{id}")]
[HttpGet]
public string Get(int id)
{
return "value";
}
}
在 IIS 上,该服务所在的站点被设置为另一个站点 (my_servername_com) 下的 "Application" (AppAPI)。
IIS 上的站点结构看起来像...
* Server
+ Application Pools
+ Sites
+ my_servername_com
+ AppAPI (application)
+ bin
- default.aspx
- global.asax
- web.config
如您所见,我在站点中包含了一个测试页; default.aspx。此页面在两个位置都正确显示,因此我知道该站点 运行 并且可以访问,并且至少根目录 url 是正确的。在本地站点上可以访问服务这一事实向我表明路由也设置正确。
http://localhost:100/AppAPI/default.aspx -- works
http://my.servername.com/AppAPI/default.aspx -- works
排除了我能想到的任何编码或路由问题后,它给我留下了某种环境问题。我检查了两台服务器上的 IIS 设置,它们看起来是一样的,所以我不确定还有什么要看的。
我的本地环境(有效)...
OS: Windows 7 Professional
IIS: IIS 7 (7.5.7600.16385)
.NET Framework : .NET 4.5 (4.5.50938)
我的生产环境(不工作)...
OS: Windows Web Server 2008
IIS: IIS 7 (7.0.6000.16386)
.NET Framework: .NET 4.5 (4.5.51209)
所以我认为有两种可能性...
- 网络问题? - 我不确定这里可能有什么问题。一种
在我的操舵室外面很少。
- 一些被忽略的配置?
经过进一步研究后,我发现围绕 global.asax 和 WebApiConfig 存在许多问题。因为它看起来可能是相关的,所以我在这里添加了它们,但重要的是要注意这是 不是 MVC 应用程序。
我没有创建 WebApiConfig class,而是创建了一个名为 "Routing.cs" 的 class 来做同样的事情。也就是简单的开启属性路由。
public class Routing
{
public static void RegisterRoutes(HttpConfiguration config)
{
// enable attribute routing
// http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2
config.MapHttpAttributeRoutes();
}
}
当然,这只是在 global.asax 中调用。
protected void Application_Start(object sender, EventArgs e)
{
GlobalConfiguration.Configure(Routing.RegisterRoutes);
}
有人能提供的任何信息都会有所帮助。我快没主意了。下一步将是重写 ASMX 中的服务……呃……我不想那样做!
谢谢,
G
从这个link:
https://weblog.west-wind.com/posts/2011/Mar/27/ASPNET-Routing-not-working-on-IIS-70
检查 "runAllManagedModulesForAllRequests" 在 web.config 中是否为真。
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
检查 IIS 中处理程序的顺序:
ExtensionlessUrlHandler-Integrated-4.0
应该在 StaticFile
之前,否则您的 api 呼叫将由 StaticFile
处理,导致 404。
IIS -> Website -> Handler Mappings -> View Ordered List
如果您的 web.config 中不需要 StaticFile
处理程序,您可以完全删除它:
<handlers>
<remove name="StaticFile"/>
</handlers>
还有一个类似的话题here。
我有一个 WebAPI2 Web 服务,可以在我的开发站点和本地临时站点上运行,但是当我推送到生产环境时,我在尝试访问相同的服务时遇到 404 错误。
这是问题的一个例子...
// production server returns 404 Error
http://my.servername.com/AppAPI/CustomerAPI/Session/4
// local stage site works
http://localhost:100/AppAPI/CustomerAPI/Session/4
我知道导致 404 的原因有很多。首先想到的是糟糕的路线,这似乎是我在研究中看到的大多数 404 问题的根源。如控制器代码所示,我正在使用 WebAPI 2 属性路由...
public class SessionController : ApiController
{
[Route("CustomerAPI/Session/{id}")]
[HttpGet]
public string Get(int id)
{
return "value";
}
}
在 IIS 上,该服务所在的站点被设置为另一个站点 (my_servername_com) 下的 "Application" (AppAPI)。
IIS 上的站点结构看起来像...
* Server + Application Pools + Sites + my_servername_com + AppAPI (application) + bin - default.aspx - global.asax - web.config
如您所见,我在站点中包含了一个测试页; default.aspx。此页面在两个位置都正确显示,因此我知道该站点 运行 并且可以访问,并且至少根目录 url 是正确的。在本地站点上可以访问服务这一事实向我表明路由也设置正确。
http://localhost:100/AppAPI/default.aspx -- works
http://my.servername.com/AppAPI/default.aspx -- works
排除了我能想到的任何编码或路由问题后,它给我留下了某种环境问题。我检查了两台服务器上的 IIS 设置,它们看起来是一样的,所以我不确定还有什么要看的。
我的本地环境(有效)...
OS: Windows 7 Professional
IIS: IIS 7 (7.5.7600.16385)
.NET Framework : .NET 4.5 (4.5.50938)
我的生产环境(不工作)...
OS: Windows Web Server 2008
IIS: IIS 7 (7.0.6000.16386)
.NET Framework: .NET 4.5 (4.5.51209)
所以我认为有两种可能性...
- 网络问题? - 我不确定这里可能有什么问题。一种 在我的操舵室外面很少。
- 一些被忽略的配置?
经过进一步研究后,我发现围绕 global.asax 和 WebApiConfig 存在许多问题。因为它看起来可能是相关的,所以我在这里添加了它们,但重要的是要注意这是 不是 MVC 应用程序。
我没有创建 WebApiConfig class,而是创建了一个名为 "Routing.cs" 的 class 来做同样的事情。也就是简单的开启属性路由。
public class Routing
{
public static void RegisterRoutes(HttpConfiguration config)
{
// enable attribute routing
// http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2
config.MapHttpAttributeRoutes();
}
}
当然,这只是在 global.asax 中调用。
protected void Application_Start(object sender, EventArgs e)
{
GlobalConfiguration.Configure(Routing.RegisterRoutes);
}
有人能提供的任何信息都会有所帮助。我快没主意了。下一步将是重写 ASMX 中的服务……呃……我不想那样做!
谢谢, G
从这个link:
https://weblog.west-wind.com/posts/2011/Mar/27/ASPNET-Routing-not-working-on-IIS-70
检查 "runAllManagedModulesForAllRequests" 在 web.config 中是否为真。
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
检查 IIS 中处理程序的顺序:
ExtensionlessUrlHandler-Integrated-4.0
应该在 StaticFile
之前,否则您的 api 呼叫将由 StaticFile
处理,导致 404。
IIS -> Website -> Handler Mappings -> View Ordered List
如果您的 web.config 中不需要 StaticFile
处理程序,您可以完全删除它:
<handlers>
<remove name="StaticFile"/>
</handlers>
还有一个类似的话题here。