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

时间:2011-05-20 18:03:07

标签: c# asp.net-mvc

我正在为一些公共页面创建一个锁定机制,它应该只允许一个用户同时编辑它们。客户端向服务器发出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 }));
        }
    }
}

如果我遗漏了其他任何内容,请告诉我。再次感谢!

1 个答案:

答案 0 :(得分:14)

如果您正在设置错误代码(即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)
    {
        [...]
    }
}