HTTP失败响应覆盖非本地客户端的响应正文

本文关键字:响应 客户端 正文 失败 覆盖 HTTP | 更新日期: 2023-09-27 17:57:28

我正在为一些公共页面创建一个锁定机制,该机制应该只允许一个用户同时编辑它们。客户端对请求锁的服务器进行GET API调用,该调用返回一个MVC ActionResult对象。出于某种原因,当我在本地运行程序并返回new HttpConflictResult("Cannot acquire lock", message);(表示获取锁失败)时,它工作得很好。错误消息可以正确发送和接收,并且可以显示在警报或任何需要的内容中。但是,当我远程访问网站时,消息会被覆盖为"由于发生冲突,页面未显示。"我是做错了什么,还是这是IIS的"功能"或其他什么?如果是,有没有办法绕过它,这样我仍然可以得到我想要给客户的消息?

提前感谢您的帮助!

编辑:对不起,忘记了HttpConflictResult是一个继承的类。这里有一些信息:

public class HttpConflictResult : HttpErrorResult
{
    public HttpConflictResult() : this(string.Empty) { }
    public HttpConflictResult(string errorMessageResource) : this("Conflict", errorMessageResource, true) { }
    public HttpConflictResult(string statusMessage, string errorMessage) :
        base(409, statusMessage, errorMessage) { }
}
public class HttpErrorResult : ActionResult
{
    protected int _statusCode;
    protected string _statusMessage;
    protected string _errorMessage;
    public HttpErrorResult(int statusCode, string statusMessage, string errorMessageResource)
    {
        _statusCode = statusCode;
        _statusMessage = statusMessage;
        _errorMessage = errorMessage;
    }
    public override void ExecuteResult(ControllerContext context)
    {
        context.HttpContext.Response.StatusCode = _statusCode;
        context.HttpContext.Response.StatusDescription = _statusMessage;
        if(_errorMessage != null)
        {
            context.HttpContext.Response.ContentType = "application/json; charset=utf-8";
            context.HttpContext.Response.Clear();
            System.Web.Script.Serialization.JavaScriptSerializer ser = new System.Web.Script.Serialization.JavaScriptSerializer();
            context.HttpContext.Response.Write(ser.Serialize(new { message = _errorMessage }));
        }
    }
}

如果我遗漏了什么,请告诉我。再次感谢!

HTTP失败响应覆盖非本地客户端的响应正文

如果您正在设置错误代码(即4xx或5xx范围内的http状态代码),并且您在IIS 7下运行,则需要确保您已告知IIS不要使用标准错误消息。

使用Response对象上的TrySkipIisCustomErrors参数可以执行此操作。尝试修改您的HttpErrorResult如下:

public override void ExecuteResult(ControllerContext context)
{
    // Set TrySkipIisCustomErrors to ensure ASP.NET sends your error content to the
    // user instead of the default ASP.NET content under IIS 7.
    context.HttpContext.Response.TrySkipIisCustomErrors = true;
    context.HttpContext.Response.StatusCode = _statusCode;
    context.HttpContext.Response.StatusDescription = _statusMessage;
    if(_errorMessage != null)
    {
        [...]
    }
}