2016-10-18 14 views
0

私は別のWebサービスから、いくつかのXMLデータを取得するために私のASP.NET MVCプロジェクト内の以下の方法を使用しています:ASP.NET MVC:出力の検証

[HttpPost] 
[ValidateInput(false)] 
public ActionResult MyAction() 
{ 
    try 
    { 
     byte[] reqContent = Helper.GetBytes(Request.Unvalidated.Form["xml"]); 

     WebRequest request = WebRequest.Create("url"); 
     request.Method = "POST"; 
     request.ContentType = "text/xml"; 
     request.ContentLength = reqContent.Length; 
     request.GetRequestStream().Write(reqContent, 0, reqContent.Length); 

     string responseXml = null; 

     using (WebResponse response = request.GetResponse()) 
     { 
      using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
      { 
       responseXml = reader.ReadToEnd(); 
      } 
     } 

     return Content(responseXml, "text/xml"); 
    } 

    catch(Exception) 
    { 
     return Json(new { Error = true }); 
    } 
} 

要求をアクションは完璧に動作し、私の内側私はコードをデバッグするときに適切な応答を得る。しかし、残念ながらChrome Debugツールを見ると、WebRequestを使用して送信されたリクエストではなく、私のアクションのレスポンスコードは500です。 "潜在的に危険なRequest.Form値がクライアントから検出されました(xml = somexml) 。 "。

出力検証には何らかの種類がありますか、ここで他のものを紛失していますか? MyActionコントローラメソッドへのPOSTリクエストの本体もXMLデータで構成されていますが、RequestオブジェクトのValidateInput(false)属性とプロパティーのUnvalidatedプロパティを使用しても例外はなく、すべて正常に動作します。

EDIT:SOLUTION受け入れとして私はマークの答えに

おかげで、私は日付のみ規格までの入力検証を変更していない、私はまた、考えられる原因を深く掘って、問題があったことを実現しましたグローバルOutputCacheAttributeThis postがついにこの問題を解決しました。

答えて

2

MVCはアクションを実行する前にPOSTリクエストを検証しています。新しい方法は、[AllowHtml]でXMLを保持するプロパティを属性にすることです。 [ValidateInput(false)]は推奨されていません。 Securing Your ASP.NET Applicationsを参照してください。

public class PostXmlModel { 
    [AllowHtml] 
    public string Xml {get; set;} 
} 

[HttpPost] 
public ActionResult MyAction(PostXmlModel postData) { 
    string xml = postData.Xml; 
    // ... 
} 

PS:[ValidateInput(false)]作品を作るために、あなたはまた、web.configファイル(推奨されません)に<httpRuntime requestValidationMode="2.0" />を設定する必要があります。 Allow user to input html in asp net mvc validateinput or allowhtmlを参照してください。