当前位置: 首页 > 知识库问答 >
问题:

可以上网。配置httpErrors部分和WebAPI区域是否共存?

乐钱青
2023-03-14

我有一个ASP. net MVC 5项目,它在特定的API区域中包含一个WebAPI。我在我的web.config中启用了IIS7错误处理,如下所示:

<system.webServer>
    <httpErrors errorMode="Custom" existingResponse="Replace">
        <remove statusCode="400" subStatusCode="-1" />
        <remove statusCode="404" subStatusCode="-1" />
        <remove statusCode="500" subStatusCode="-1" />
        <error statusCode="400" path="400.html" responseMode="File" />
        <error statusCode="404" path="404.html" responseMode="File" />
        <error statusCode="500" path="500.html" responseMode="File" />
    </httpErrors>
</system.webServer>

当404/500等发生时,这将向MVC网站的用户显示友好的消息。当WebAPI返回特定的(合法的)状态代码时,我的问题就出现了(例如,当调用'/api/Token'时为400)。在这些情况下,响应的JSON内容被IIS拦截,我的友好消息超文本标记语言作为响应返回,而不是来自WebAPI的原始JSON。是否可以从IIS错误处理中排除API区域?如果无法做到这一点,那么允许ASP. net MVC网站友好消息和WebAPI JSON响应共存的正确解决方案是什么?

共有1个答案

穆鸿飞
2023-03-14

经过大量阅读和实验,我发现这种设置组合非常有效:

每个响应状态代码对应一个aspx和一个html页面(这是我的):

  • 404.aspx
  • 404.html
  • 500.aspx
  • 500.html

这两个页面的唯一区别是aspx页面包含以下行:

<% Response.StatusCode = 500 %>
<% Response.TrySkipIisCustomErrors = true %>

第一行将正确的HTTP状态代码发送回客户端,第二行尝试说服IIS它不需要自己处理响应。

自定义错误应该是on,或remoteonly,并指向aspx文件:

<customErrors mode="On" defaultRedirect="500.aspx" redirectMode="ResponseRewrite">
  <error statusCode="404" redirect="404.aspx" />
</customErrors>

IIS自定义错误也应打开,并指向系统中的html文件。Web服务器部分:

<httpErrors errorMode="Custom" existingResponse="Auto">
  <remove statusCode="404" subStatusCode="-1" />
  <remove statusCode="500" subStatusCode="-1" />
  <error statusCode="404" path="404.html" responseMode="File" />
  <error statusCode="500" path="500.html" responseMode="File" />
</httpErrors>

如果设置了SetStatus标志,则existingResponse=“Auto”告诉IIS仅返回友好的错误页面。实际上,这允许ASP。net发送回自定义响应,从customErrors部分返回其自己的自定义错误页,或允许IIS返回配置的友好错误页。

默认的ASP. net MVC/WebAPI项目配置了一个HandleErrorAtoun过滤器,该过滤器处理从操作中引发的异常,并返回正确配置的自定义错误页。我已经扩展了这个类来处理来自WebAPI操作的异常,方法是从这个类派生的:

filters.Add(new HandleExceptionAttribute());
public class HandleExceptionAttribute : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAjaxRequest() && filterContext.Exception != null)
        {
            filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
            filterContext.HttpContext.Response.StatusDescription = filterContext.Exception.Message;
            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
        }
        else
        {
            base.OnException(filterContext);
        }
    }
}

此类处理来自WebAPI操作的异常,并将异常消息作为JSON响应(具有正确的HTTP状态)返回给调用方。如果异常消息对用户不友好,或者客户端不知道如何解释这些消息,则可能不希望这样做。

 类似资料:
  • 我注意到在WifiManager类中有一个名为addNetwork的函数,如果我想恢复或保存网络信息(网络名AKA SSID,以及密码和类型),它可能会很有用,这样我也可以连接到它。 我找不到多少关于如何做这样一件事的信息。我看过StackOverflow的各种例子,如果我针对Android API 28(或更低),我确实成功地让它添加了一个网络,甚至连接到它。 然而,当目标是Android29(

  • 背景 目前,我有一个解决方案,我在PDF中循环并在其中绘制黑色矩形。 所以我已经有了一个PDRectangle列表,它代表了我需要在pdf上填充/覆盖的正确区域,隐藏了我想要的所有文本。 问题所在 问题1:黑色矩形下方的文本很容易被复制、搜索或通过其他工具提取。 我通过展平我的pdf来解决这个问题(将其转换为图像,使其成为单层文档,黑色矩形不再被欺骗)。与此处描述的解决方案相同:使用pdfBox禁

  • 我正在写一个jar,打算与Spring和Ehcache一起使用。Spring要求为每个元素定义一个缓存,所以我计划为jar定义一个Ehcache,最好是作为jar中的一个资源,可以导入应用程序的主要Ehcache配置。然而,我对示例Ehcache配置文件的阅读和我的谷歌搜索并没有找到任何导入子Ehcache配置文件的方法。 有没有办法导入一个子Ehache配置文件,或者有没有其他方法来解决这个问题

  • 我的所有AWS代码(API网关、Lambda、SQS、EC2等)目前都位于Canada Central(ca-Central-1)区域。我计划发送电子邮件使用AWS SES从EC2. 我正在尝试使用本指南在SES中启用电子邮件接收,使用基于我的Route 53域的自定义电子邮件地址(例如,)。然而,我刚刚意识到我所在的地区不支持电子邮件接收,因为它仅在us-east-1、us-west-2和eu-

  • 问题内容: 我只需要解码和更新json对象的特定值。问题是我不知道对象的完整结构。encoding / json包“忽略” /截断了结构中未提供的字段,因此对这些字段进行编码会丢失。我想知道是否有可能仅解组我知道的结构,对其进行更新,然后再进行组封而不截断/删除未知的结构/信息。 问题答案: 似乎有可能。

  • 问题内容: 我一直在尝试将五个公共IP之一分配给我的docker容器。由于docker的性质及其用途,似乎这应该是可能的。我找到了我认为可以解释我要做什么的网站,但是自从Docker离开LXC以来,它不再起作用: http://programster.blogspot.com/2014/06/docker-run-multiple-docker-websites- on.html 我曾尝试与我的容