gpt4 book ai didi

c# - 不修改现有响应的 MVC Controller 操作

转载 作者:太空宇宙 更新时间:2023-11-03 15:37:41 25 4
gpt4 key购买 nike

简而言之,我编写了一个错误处理程序 Controller ,它有一个“HandleError”操作,可以处理我想处理的所有 http 错误。

由于一些原因(在 this answer 中概述),我在两个地方发现了 http 错误。一个是全局Application_EndRequest方法(托管管道),另一个是通过 <httpErrors> Web 配置中的部分( native 自定义错误模块)。

如果你想知道为什么我需要 <httpErrors>部分,这是因为某些响应并不总是被托管管道捕获,例如 StaticFile处理程序捕获所有 url,如“.html,.txt”,并且不会触发 MVC 代码。

我的 Controller Action 看起来很接近这个

public ActionResult HandleError(int statusCode = 0, Exception exception = null)
{
string responseProcessed = Request.Headers.Get("__p__");

if (responseProcessed == null)
{
Request.Headers.Add("__p__", "1");

switch (statusCode)
{
case 401:
return Unauthorized();
case 403:
return Forbidden();
case 404:
return NotFound();
case 500:
return InternalError(exception);
default:
return UnhandledError(exception, statusCode);
}
}
else
{
return null;
}
}

我的 web.config httpErrors 部分当前是

<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="404"/>
<error statusCode="404" path="/Errors/HandleError?statusCode=404" responseMode="ExecuteURL"/>
</httpErrors>

问题

问题是,HandleError每个 404 响应调用两次方法,因为它首先命中自定义错误模块(通过 web.config 指定),然后是我的 Application_EndRequest钩子(Hook)捕获 404,这也触发了我的操作。

问题

问题是,我怎样才能使我的 HandleError action 对响应什么都不做,而不是用空白响应替换它(这是当您在操作中返回 null 时发生的情况)。

注意

请注意,我知道我可以让我的自定义 404 错误(在 web.config 中)指向我的 NotFound显式操作,即使它被调用两次,每次也只返回 View 。有些逻辑(日志记录等)仍然只需要运行一次,我认为将它全部指向 HandleError 是更好的设计。方法而不是保持重复检查逻辑并只运行一次操作。

最佳答案

简单的答案是......你不能。无论如何,所有操作方法都返回一种 ActionResult 类型。如果您不需要 actionresult(或返回 null 时发送的默认 EmptyResult),则不要使用 action 方法并考虑使用私有(private)方法。

如果你这样做,你可以按照你的建议使用自定义 404,然后根据需要从你的 Controller 中调用这个私有(private) HandleError 方法。

如果此逻辑需要针对每个请求运行,那么请考虑将其放入操作过滤器中。

关于c# - 不修改现有响应的 MVC Controller 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31297899/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com