根据客户接收不同的响应

本文关键字:响应 客户 | 更新日期: 2023-09-27 18:34:56

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

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

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

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

我已将有问题的代码行缩小到以下操作结果代码段的第一行:

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

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

  1. 是否有理由让 .NET 或 IIS 根据客户端类型或位置截获和更改响应?
  2. 是否有一种简单的方法可以在此代码和调度到客户端之间的任何时间点查看响应?

谢谢!


更新:我更改了Web应用程序以使用HttpResponseException。现在我收到以下 YSOD 异常:

处理 HTTP 请求导致异常。请看 由 this 的"响应"属性返回的 HTTP 响应 详细信息的例外情况。

使用 MVC 版本 5,Visual Studio 2013。操作结果的代码如下所示:

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",并且在某些情况下似乎出于我不知道的原因而被调用(尽管这个问题可能会开始阐明一些信息(。一旦我将其更改为此,它就会按预期工作:

<httpErrors errorMode="Detailed" />

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

根据客户接收不同的响应

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

此外,我建议遵循一种模式,在从 Web API 调用发送回信息时返回如下 HttpResponseMessage:

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