2011-05-20 67 views
8

我正在为一些公开页面创建一个锁定机制,该机制应该只允许一个用户同时编辑它们。客户端向请求锁的服务器发出GET API调用,该锁返回MVC ActionResult对象。出于某种原因,当我在本地运行程序并返回new HttpConflictResult("Cannot acquire lock", message);(表示获取锁失败)时,它工作正常。错误消息被正确发送和接收,并可以显示在警报或任何需要的。但是,当我远程访问站点时,该消息将被覆盖,“页面未显示,因为存在冲突。”我做错了什么或者这是IIS的一个'功能'或什么?如果是这样,是否有办法解决这个问题,这样我仍然可以得到我想要给客户的信息?HTTP失败响应覆盖非本地客户端的响应正文

在此先感谢您的帮助!

编辑:对不起,忘了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 })); 
     } 
    } 
} 

让我知道,如果我离开了其他东西。再次感谢!

+0

呃,小心解释一下'HttpConflictResult'?你调用它的方式? – 2011-05-20 18:06:47

+0

你正在发送一个错误代码。 IIS将写出消息来保护您。你必须配置IIS。我不记得你需要更改ATM – 2011-05-20 22:22:13

回答

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) 
    { 
     [...] 
    } 
} 
+1

完美。这正是我所需要的。非常感谢! – Chris 2011-05-23 16:27:59

+1

没问题,这是我花了一些时间敲我的头以前的东西;) – 2011-05-23 18:15:42

+1

@ zhaph-ben-duguid谢谢你做我们的头猛击! :) – orad 2015-10-27 18:41:33