2017-09-13 41 views
1

我有以下代碼ASP.NET的ActionResult給出了本地主機和Azure的Web服務不同的響應託管

public ActionResult PerformMagic(string a, string b, int c) 
{ 
    try 
    { 
     // Some code which always gives an error and go to catch block 
    } 
    catch (Exception ex) 
    { 
     // ex.Message = "An error occured" 

     Response.StatusCode = (int)HttpStatusCode.BadRequest; 
     return this.Content(System.Web.Helpers.Json.Encode(new { error = ex.Message }), "application/json"); 
    } 
} 

所以調用返回如下的結果,

{ 
    config : {method: "GET", transformRequest: Array(1), transformResponse: Array(1), jsonpCallbackParam: "callback", paramSerializer: ƒ, …} 
    data : 
     error : "An error occured" 
    __proto__ : Object 
    headers : ƒ (name) 
    status : 400 
    statusText : "" 
    __proto__ : Object 
} 

所以,我得到的data在JSON內部,查找error並將該值(即An error occured)顯示爲警報。

在本地主機上運行時,這完美的作品,但在部署該天青應用服務,運行,響應來自如下

{ 
    config : {method: "GET", transformRequest: Array(1), transformResponse: Array(1), jsonpCallbackParam: "callback", paramSerializer: ƒ, …} 
    data : "Bad Request" 
    headers : ƒ (name) 
    status : 400 
    statusText : "Bad Request" 
    __proto__ : Object 
} 

這意味着,我不能找到errordata。任何人都可以解釋我爲什麼這樣表現?

+1

我的第一個猜想是你在本地啓用調試和部署在Azure中的發行版本不返回異常詳細信息?這是一件好事,因爲例外可能是信息泄漏。 –

+0

@RickvandenBosch即使在調試配置中部署應用程序時也會出現相同的行爲 –

回答

2

事實證明,原因在於httpErrors element。我可以將Azure上具有不同默認行爲的此元素映射爲與本地計算機上的行爲相比較。

長話短說:您可以通過在web.config中system.WebServer元素添加此解決它:

<httpErrors existingResponse="PassThrough" /> 

可能的值是自動(0),更換(1)和直通(2):

existingResponse values

我不能完全肯定這種變化的安全隱患。但是,它確實可以讓您向可能不屬於此處的用戶返回(例外)詳細信息。

答案是基於這篇文章:ASP.NET+Azure 400 Bad Request doesn't return JSON data

+0

工作過 - 真的不知道這件事。感謝您的信息。 –

1

確保兩臺計算機(localhost和azure)都運行相同的.NET Framework。否則,請檢查處理序列化的NuGet包中的奇怪緩存。

相關問題