Azure网站上的REST API上的400.0错误请求

时间:2014-02-08 07:19:04

标签: asp.net azure

我已将REST服务迁移到Azure网站,但它一直返回400.0 Bad Request错误(错误代码为零)。

该服务在本地运行,并且在Web角色中运行时运行良好。进入网站后,它开始返回400.0错误。

我的web.config:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
        <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </modules>
</system.webServer>
<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
    <standardEndpoints>
        <webHttpEndpoint>
            <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="false" />
        </webHttpEndpoint>
    </standardEndpoints>
</system.serviceModel>

我已经在我的班级中设置了ASP.NET兼容性:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class BookingService { ... }

和Global.asax.cs中定义的正确路由:

private void Application_Start (object sender, EventArgs e) {
    RouteTable.Routes.Add(new ServiceRoute("booking/service", new WebServiceHostFactory(), typeof(BookingService)));
}

现在,当我尝试在本地访问REST API时,它可以正常工作:

http://localhost/booking/service/help

但是,将Web服务上载到Azure网站并执行以下操作后:

http://xxx.azurewebsites.net/booking/service/help

它返回400.0错误请求。详细的错误日志显示:

Request: ManagedPipelineHandler
Notification: ExecuteRequestHandler
Handler:  System.ServiceModel.Activation.AspNetRouteServiceHttpHandler
Error code: 0x00000000

我完全迷失了。谷歌搜索网络没有产生任何帮助。我尝试将以下内容放入web.config:

<handlers>
    <add name="UrlRoutingHandler" preCondition="integratedMode" verb="*" path="UrlRouting.axd" type="Foo.RoutingHandler" />
</handlers>

并通过扩展UrlRoutingHandler和定义VerifyAndProcessRequest来定义处理程序,但它仍然不起作用。

1 个答案:

答案 0 :(得分:0)

最后在逐位剥离服务后发现错误。

发生的事情是:

  • RouteTable.Routes.Add添加了一个创建类BookingService对象作为处理程序
  • 的路由
  • 班级BookingService有一个 static 属性,已初始化
  • 此初始化语句失败(由于某些原因,此处不提)
  • 因此,当路由服务尝试创建BookingService类时,该类的静态初始化程序首先运行并失败
  • 因此,代码从未到达路由服务,因此服务在AspNetRouteServiceHttpHandler处理程序中失败
  • 如果类在运行静态初始化程序时失败,但在对象创建期间,路由服务可能会抛出一个更有意义的错误,指出问题

总之,如果您在处理程序中看到路由请求失败,则可能是由无法加载的类代码引起的(由于静态初始化程序失败或其他原因)。