7

HTTP リクエストを介して xml 文字列を送信し、相手側で受信しようとしています。受信側では、xml が null であることを常に取得しています。その理由を教えてください。

送信:

    var url = "http://website.com";
    var postData = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?><xml>...</xml>";
    byte[] bytes = System.Text.Encoding.ASCII.GetBytes(postData);

    var req = (HttpWebRequest)WebRequest.Create(url);

    req.ContentType = "text/xml";
    req.Method = "POST";
    req.ContentLength = bytes.Length;

    using (Stream os = req.GetRequestStream())
    {
        os.Write(bytes, 0, bytes.Length);
    }

    string response = "";

    using (System.Net.WebResponse resp = req.GetResponse())
    {
        using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
        {
            response = sr.ReadToEnd().Trim();
        }
     }

受け取る:

[HttpPost]
[ValidateInput(false)]
public ActionResult Index(string xml)
{
    //xml is always null
    ...
    return View(model);
}
4

2 に答える 2

0

これは、指定したためだと思いますreq.ContentType = "text/xml";

「プリミティブ」タイプを使用してコントローラーを定義したときのことを正しく覚えていれば(stringここでは「プリミティブ」タイプです)

public ActionResult Index(string xml){}

MVC はxml、クエリ文字列または投稿されたフォーム データ (html 入力フィールド) のいずれかを検索しようとします。しかし、より複雑なものをサーバーに送信すると、MVC はそれを特定のクラスにラップします。

たとえば、サーバーに複数のファイルをアップロードする場合、コントローラーで次のようにそれらを受け入れることができます

public ActionResult Index(IEnumerable<HttpPostedFileBase> files){}

text/xmlしたがって、正しいクラスを使用してコントローラーでストリームを受け入れる必要があると思います。

アップデート:

データストリームを受け入れるため(そして入力要素から来ていないため)、そのようなクラスはないようです。独自のモデル バインダーを記述して、xml ドキュメントを受け入れることができます。以下の説明を参照してください。

text/xml を ASP.MVC コントローラーに読み込む

XML を POST として ASP MVC .NET の ActionResult に渡す方法

于 2013-08-19T19:36:00.143 に答える