2011-05-20 100 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