2013-08-19 3 views
7

Sto tentando di inviare una stringa xml attraverso una richiesta HTTP e di riceverla dall'altra parte. Alla fine ricevo sempre che l'xml è nullo. Puoi dirmi perché è così?Come inviare xml tramite una richiesta HTTP e riceverlo utilizzando ASP.NET MVC?

Invia:

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(); 
     } 
    } 

ricezione:

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

risposta

9

ero in grado di ottenere questo lavoro in questo modo:

[HttpPost] 
[ValidateInput(false)] 
public ActionResult Index() 
{ 
    string xml = ""; 
    if(Request.InputStream != null){ 
     StreamReader stream = new StreamReader(Request.InputStream); 
     string x = stream.ReadToEnd(); 
     xml = HttpUtility.UrlDecode(x); 
    } 
    ... 
    return View(model); 
} 

Tuttavia, sono ancora curioso di sapere perchè prendendo l'XML come un parametro non funziona.

+0

sembra un po 'brutto, ma ha lavorato anche per me con MVC 4. – AFract

+0

Grazie anche lavorato per me .. .Se stai scrivendo come un flusso si deve leggere input stream per ottenere i dati. Per ricevere in "xml" vairable devi inviare questo con query string come parametro post –

0

Credo sia perché hai specificato req.ContentType = "text/xml";.

Se non ricordo male quando si definisce il controllore utilizzando un tipo di "primitivo" (string essere un tipo "primitivo" qui)

public ActionResult Index(string xml){} 

MVC proverà a cercare xml sia in una stringa di query o in i dati del modulo pubblicati (campo di input html). Ma se si invia qualcosa di più complesso al server, MVC lo avvolgerà in una classe specifica.

Ad esempio, quando si carica diversi file sul server si può accettare come riportato di seguito nel controller

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

Quindi la mia ipotesi è che si deve accettare il flusso text/xml nel controller utilizzando la classe corretta .

Aggiornamento:

Sembra che non ci sia una classe perché si accetta un flusso di dati (e non è venuta da elemento di input). È possibile scrivere il proprio modello di raccoglitore per accettare il documento xml. Vedi le discussioni qui sotto.

Reading text/xml into a ASP.MVC Controller

How to pass XML as POST to an ActionResult in ASP MVC .NET