【问题标题】:How do I return an exception from Azure Mobile Services如何从 Azure 移动服务返回异常
【发布时间】:2016-01-26 09:17:43
【问题描述】:

我制作了一个 Azure 移动服务,可以在本地正常运行。

然后我将 Azure 移动服务发布到云端,网站显示它当前正在运行。

然后我在我发布的网站上创建一个GET Request,它会返回以下内容:

状态 500 内部服务器错误 500 内部服务器错误 A 通用 错误消息,当没有更具体的消息适合时给出

{ "message": "发生错误。" }

我已经尝试添加:

<system.web>
    <customErrors mode="Off"/>
</system.web>

Site\wwwroot 目录中的我的Web.Config,但这并没有做任何事情。

那么如何从我的 azure 移动服务返回更有意义的错误?

【问题讨论】:

  • 关闭 customErrors 后,您是否尝试过使用 Fiddler (telerik.com/fiddler) 拨打电话?您可以检查原始响应,然后它应该可以指示遇到的错误。你也可以试试远程调试blogs.msdn.com/b/webdev/archive/2013/11/05/…
  • @Flexicoder 我从提琴手那里得到了同样的回应(以前我用的是Postman
  • 但是您现在不能查看原始响应吗?现在关闭 customErrors 应该会为您提供更多信息
  • @Flexicoder 如果您有兴趣,我已经在下面发布了答案。 customErrors 不影响 Web API's
  • 我会看看,但当 API 出错时我会得到详细信息,但我也会检查一下

标签: c# azure azure-mobile-services


【解决方案1】:

所以从Web API 返回错误与从Asp.netiis 返回错误不同

来自this link 我发现了以下内容:

今天,Kurt 和我正在尝试调试我们拥有的 Web API 服务 部署到远程机器。该服务返回 500 个错误, 由于各种原因,我们不能只尝试执行来自 那个部署的盒子。我们希望在 响应,但我们只是看到空白 500 错误,没有响应。

我们首先尝试了自定义错误的 Web.Config 设置:

<customErrors mode="Off" />

但这并没有影响任何事情。进一步挖掘,我们发现 ASP.NET Web API 使用不同的配置来获取错误详细信息 被传递。这有几个原因;一、习俗 Web.Config 中的错误元素是 ASP.NET 的东西。这是一个东西 ASP.NET 用来确定黄色死屏是否与 应向用户显示更多详细信息。但是,ASP.NET Web API 设计为在 ASP.NET 和 IIS 之外自托管。虽然 customErrors 元素会影响对 ASPX 和 MVC 的请求,它确实 Web API 没有。

Web API 不是依赖大量的 XML 配置,而是使用了很多 程序化配置。这有助于自我托管,但对于 更改错误详细信息等策略,我们必须更改代码, 重新编译和重新部署。要在我们的应用程序中设置错误策略, 我们需要修改我们的全局 Web API 配置:

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy 
    = IncludeErrorDetailPolicy.Always;

使用这种模式,来自任何来源的请求都会让我们完全异常 细节。这可能不是我们在生产中想要的东西,但很好 它是可用的。

因此,总而言之,要查看来自 Web API 的错误,您需要转到 Startup 类,在那里您将看到 ConfigureMobileApp 方法。

这将包括以下行:

HttpConfiguration config = new HttpConfiguration();

并且您想添加以下内容:

config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;

【讨论】:

    【解决方案2】:

    Azure 移动服务处理所有异常并引发带有通用错误消息的 HttpResponseException,如果您想获取详细的错误消息,您可以执行以下操作:

    // POST tables/TodoItem
    public async Task<IHttpActionResult> PostTodoItem(TodoItem item)
    {
      try
      {
        TodoItem current = await InsertAsync(item);
        return CreatedAtRoute("Tables", new { id = current.Id }, current);
      }
      catch (HttpResponseException ex)
      {
        string message = ((HttpError)((ObjectContent)ex.Response.Content).Value).First().Value.ToString();
        string[] temp = message.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
        var resp = new HttpResponseMessage(HttpStatusCode.BadRequest)
        {
          Content = new StringContent(message),
          ReasonPhrase = temp[0]
        };
        throw new HttpResponseException(resp);
      }
    }
    

    article 为我指明了正确的方向

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多