我已向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之后查看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>
答案 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
希望这有帮助!