2011-09-17 78 views
6

我一直在開發一些日子我的本地機器上的Web應用程序的質疑,現在使用Visual Studio 2010。昨天晚上,我在IIS上部署7我的應用程序和跨令人沮喪絆倒主要表演停止。該問題與Ajax請求中的錯誤處理有關。首先,我有一些編輯屏幕可以處理Ajax請求。以下是Ajax編輯屏幕的ajax部分的外觀。與錯誤在ASP.net Ajax請求處理MVC

@using (Ajax.BeginForm("_CityEdit", null, new AjaxOptions { HttpMethod = "Post", UpdateTargetId = "content", 
                  LoadingElementId="imgSaveLoading", OnFailure="onError", 
                  OnSuccess = "onSuccess" }, new { id = "frmCity" })) { 
    <img id="imgSaveLoading" alt="loading" src="@Url.Content("~/Content/Telerik/Vista/loading.gif")" class="ajax-loader-user" /> 
    <div class="content" id="content"> 
     @{Html.RenderPartial("_CityEdit");} 
    </div> 

    <!-- Some Other code here --> 
} 

我正在依靠上述Ajax.BeginForm()的「onError」回調。所以,在我的控制器,每當我想顯示錯誤的用戶(型號錯誤或任何其他錯誤),我只設置服務器響應500(內部服務器錯誤)樂觀地希望這將導致「的OnError」 Ajax.BeginForm的處理程序()被調用。這裏是我在我的控制器中做了這個的一個片段。

[HttpPost] 
public ActionResult _CityEdit(CityViewModel viewModel) { 
    city = cityManager.FindCity(viewModel.City.Id, false); 
    // Validate Model here 
    if (!TryUpdateModel(city, "City")) { 
     Response.StatusCode = 500; 
     return PartialView("_CityEdit", viewModel); 
    } 

從上面的代碼可以看出,我回到PartialView,如果它包含模型錯誤,他們將自動獲得顯示在阿賈克斯編輯屏幕。然後在「OnError」JavaScript中,我只需用控制器返回的PartialView替換相關的div即可。

function onError(xhr) { 
    $('#content').html(xhr.responseText); 
} 

這一切都在我的開發機器上運行良好。當我部署在IIS 7我的應用程序,從Windows XP中盒(帶IE 8或Chrome)訪問它,而不是PartialView,瀏覽器只顯示默認的「500內部服務器錯誤」屏幕。所以我有一些懷疑讓我昨晚沒有睡好。

  1. 是我用於Ajax編輯合理的方法。如果不是,我可以用其他方式處理Ajax編輯(能夠顯示模型錯誤)。

  2. 既然我現在已經開發這些模塊的一些天,都提出了相當大的努力,沒有任何變通得到它的工作在XP箱。基本上,如果我能以某種方式阻止瀏覽器顯示其默認的「500內部服務器錯誤」屏幕,這將是理想的。

  3. 是這種方法在Windows 7上工作,因爲我有IIS 7相同的Windows 7安裝機器,我使用瀏覽到網站,或者它只是它適用於Windows 7,以及

如果任何其他建議,請繼續。

編輯: 我已經找到了我的問題的解決方法。所以這意味着懷疑沒有2和3被回答。基本上web.config中的以下條目阻止瀏覽器顯示網站的默認瀏覽器頁面。

<system.webServer> 
     <httpErrors errorMode="Detailed"/> 
    </system.webServer> 

但是,這仍然留下了我的第一個懷疑。我是否使用了合理的方法來進行Ajax編輯?


我檢查與小提琴手的響應,它是IIS這是發送默認的錯誤頁面的服務器錯誤500.因此,需要進行配置,返回「詳細」的迴應。我們可以使用IIS管理器來做到這一點。我所遵循的另一個選項是在應用程序的web.config文件中的應用程序級別上定義它。

但是,我再次陷入兩難境地,無論是採用這種方法還是重寫我的整個應用程序。發生的問題是,如果確實發生某些模塊與500內部服務器失敗,我的代碼會在瀏覽器中顯示,因爲errorMode設置爲「詳細」。所以我需要一些方法來提供我的自定義響應,當我設置響應錯誤代碼爲500,如果應用程序的任何其他部分失敗(我不是一個設置500狀態代碼),那麼應該發送默認錯誤頁面,而不是暴露我的代碼通過「詳細」的迴應。請任何幫助。

關於, NIrvan。

+0

奇怪的是,詳細的(或僅限遠程和你是遠程的。)錯誤頁面可以解決您的問題。你的意思是整個頁面被錯誤屏幕取代,而不是內容div?這是否也更新瀏覽器中的當前網址?這聽起來更像是AJAX調用本身失敗,因爲它不應該導致正常的GET/POST - 它只能通過JS呈現。我認爲你的技術是可以接受的,因爲你無法防止AJAX調用500次*無論如何* - 'OnError'應該足以處理它們。我認爲你應該先找出'OnError'原因在部署環境中不起作用。 – bzlm

+0

@bzlm,我非常確定瀏覽器忽略了當我將響應狀態設置爲500時從控制器返回給定ajax請求的整個響應。不知何故,瀏覽器顯示自己的「500內部服務器錯誤」屏幕。但你說得對,只有內容div的內容被「500 Internal Server Error」頁面所取代。我的html頁面的其他部分仍然像以前一樣。但是,我仍然不得不阻止瀏覽器彈出它的錯誤頁面,並且「errorMode」確實解決了這個問題。我沒有改變我的應用程序中的其他任何東西(據我所知)。謝謝。 – Jatin

+0

@bzlm,這裏是我找到解決方案的地方。 http://www.bala-krishna.com/how-to-disable-500-internal-server-error-on-godaddy-windows-hosting/ – Jatin

回答