gpt4 book ai didi

ASP.NET Web API 从响应中删除 HttpError

转载 作者:行者123 更新时间:2023-12-02 14:02:53 25 4
gpt4 key购买 nike

我正在使用 Microsoft ASP.NET Web API 构建 RESTful 服务。

我的问题涉及当出现问题(例如 400 Bad Request 或 404 Not Found)时 Web API 向用户抛出的 HttpErrors。

问题是,我不想在响应内容中获得序列化的 HttpError,因为它有时提供太多信息,因此违反了 OWASP 安全规则,例如:

请求:

http://localhost/Service/api/something/555555555555555555555555555555555555555555555555555555555555555555555

作为响应,我当然得到 400,但包含以下内容信息:

{
"$id": "1",
"Message": "The request is invalid.",
"MessageDetail": "The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'MyNamespaceAndMethodHere(Int32)' in 'Service.Controllers.MyController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter."
}

这样的东西不仅表明我的 WebService 基于 ASP.NET WebAPI 技术(这还不错),而且还提供了有关我的命名空间、方法名称、参数等的一些信息。

我尝试在 Global.asax 中设置 IncludeErrorDetailPolicy

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Never;

是的,这确实不错,现在结果不包含 MessageDetail 部分,但我仍然不想得到这个 HttpError。

我还构建了自定义 DelegatingHandler,但它也会影响我自己在 Controller 中生成的 400 和 404,这是我不希望发生的情况。

我的问题是:有没有什么方便的方法可以从响应内容中删除序列化的 HttpError?我希望用户返回的错误请求只是响应代码。

最佳答案

使用自定义 IHttpActionInvoker 怎么样?基本上,您只需发送一个空的 HttpResponseMessage。

这是一个非常基本的示例:

public class MyApiControllerActionInvoker : ApiControllerActionInvoker
{
public override Task<HttpResponseMessage> InvokeActionAsync(HttpActionContext actionContext, System.Threading.CancellationToken cancellationToken)
{
var result = base.InvokeActionAsync(actionContext, cancellationToken);

if (result.Exception != null)
{
//Log critical error
Debug.WriteLine("unhandled Exception ");

return Task.Run<HttpResponseMessage>(() => new HttpResponseMessage(HttpStatusCode.InternalServerError));
}
else if (result.Result.StatusCode!= HttpStatusCode.OK)
{
//Log critical error
Debug.WriteLine("invalid response status");

return Task.Run<HttpResponseMessage>(() => new HttpResponseMessage(result.Result.StatusCode));
}


return result;
}
}

在 Global.asax 中

GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpActionInvoker), new MyApiControllerActionInvoker());

您可以做的另一件与 Web Api 无关的重要事情是删除过多的 asp.net 和 IIS HTTP header 。 Here是一个很好的解释。

关于ASP.NET Web API 从响应中删除 HttpError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17589508/

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