【问题标题】:Receiving different responses depending on client根据客户端接收不同的响应
【发布时间】:2014-12-22 22:45:30
【问题描述】:

我有两个 ASP.NET MVC Web 应用程序在同一台服务器上运行。其中之一是 Web 服务,如果发生异常,它会以纯文本形式返回错误消息。但是,目前,一些调用 Web 服务的客户端没有收到错误消息;相反,他们只是收到 HTML 格式的“错误请求”。

第二个 Web 应用(与第一个在同一服务器上)可以调用第一个处理的 URL,并且现在可以正确接收纯文本的错误消息。但是,我尝试以其他方式调用该 URL,所有这些都导致收到“错误请求”:

  • 将 URL 粘贴到我计算机上的 Chrome 中
  • 将 URL 粘贴到服务器上的 IE 中
  • 从与服务器不同的计算机上的 Web 应用调用 URL

本地不会发生此错误。当我在我的计算机上运行这 2 个网络应用程序时,我从第二个网络应用程序和从 Chrome 调用本地 URL 都收到纯文本的错误消息。

我已将有问题的代码行缩小到以下 ActionResult sn-p 的第一行:

Response.StatusCode = (int)HttpStatusCode.BadRequest;
return Content(errorMessage, ContentTypes.PlainText);

删除第一行似乎可以解决问题;但是,这也消除了我使用描述性状态代码的能力。在我看来,在返回 ActionResult 后,如果 (a) 客户端位于另一台计算机上或 (b) 客户端是网络,则响应被拦截浏览器。所以我想我有一个两部分的问题:

  1. .NET 或 IIS 是否有理由根据客户端类型或位置拦截并更改响应?
  2. 是否有一种简单的方法可以查看此代码与将其分派给客户端之间的任何时间点的响应?

谢谢!


更新:我将网络应用更改为使用 HttpResponseException。现在我收到以下 YSOD 异常:

处理 HTTP 请求导致异常。请参见 由 this 的 'Response' 属性返回的 HTTP 响应 详情例外。

使用 MVC 版本 5,Visual Studio 2013。ActionResult 的代码如下所示:

MyImage image = new MyImage(parameters);

if (image.Errors.Any())
{
    throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.BadRequest) { Content = new StringContent(image.Error) });
}

return File(image.AsJpeg(), ContentTypes.Jpeg);

有人知道如何绕过这个无用的响应吗?


更新 2: 问题原来是由于 Web.config 设置 system.webServer > httpErrors > errorMode 的默认值为“DetailedLocalOnly”并且似乎已被调用,因此错误消息被抑制在某些情况下,出于某种我不知道的原因(尽管this question 可能会开始有所启发)。一旦我把它改成这个,它就按我的预期工作了:

<httpErrors errorMode="Detailed" />

我理解为什么他们默认在远程机器上抑制错误消息,但这比我想象的要难追踪。无论如何,我希望这对将来的某人有所帮助。

【问题讨论】:

  • 放置某种日志,然后使用不同的客户端浏览器进行测试。看看你得到了什么回应。
  • 您能否分享您从其他类型收到的具体错误响应。
  • @Thanigainathan:该列表中的 3 个案例中的每一个都只导致响应类型为 HTML 的单词“Bad Request”。
  • @Andy 请使用提琴手工具查看打开链接时发送的请求标头。您提到的代码块是错误处理块吗?如果是这样,您必须检查它为什么会出现错误块
  • @Andy 这是一个很好的发现。谢谢你让我知道

标签: c# asp.net-mvc


【解决方案1】:

我想不出 IIS 会关心客户端调用服务的任何原因。我的猜测是客户端向服务器发送的请求与您认为它发送的请求不同。您可以使用名为“Fiddler”的程序来验证这一点。

另外,我建议在从 Web API 调用发回信息时遵循返回 HttpResponseMessage 的模式:

return new HttpResponseMessage(HttpStatusCode.BadRequest)
        {
            ReasonPhrase = message,
            Content = new StringContent(string.Format("{0}", exception))
        };

【讨论】:

  • 看起来 .NET 关心客户端的位置(远程与本地),但你是对的,IIS 不关心。将httpErrors errorMode 设置为Detailed(默认为DetailedLocalOnly)就可以了。感谢您的帮助。
  • 再想一想,它实际上可能与 IIS 有关(stackoverflow.com/a/18404091/361460 表明这可能是 IIS 在 .NET 完成后抑制它的方式)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-09
  • 1970-01-01
  • 2012-06-22
  • 2012-12-16
  • 1970-01-01
  • 2018-10-12
  • 2021-05-05
相关资源
最近更新 更多