2017-09-13 13 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)をアラートとして表示します。

ローカルホストで実行している場合これは完璧に動作

が、Azureのアプリケーションサービスにこれを展開して実行すると、応答が意味

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

以下のように来て、私はdata内部errorを見つける傾けます。なぜこのように振る舞うのですか?

+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

Worked - これについて本当に知りませんでした。情報のおかげで。 –

1

両方のマシン(localhostとazure)が同じ.NET Frameworkを実行していることを確認してください。それ以外の場合は、シリアル化を処理するNuGetパッケージ内の奇妙なキャッシングをチェックします。

関連する問題