2013-09-04 5 views
10

Ich habe eine Web-API, die XML lesen und an das entsprechende Modell zur Verarbeitung übergeben würde.Wie liest man XML aus der ASP.NET Web API?

Wie kann ich das eingehende XML erhalten? Welchen Datentyp sollte ich verwenden?

Verwende ich StreamReader, StreamContent oder XmlDocument oder andere?

Antwort

12

ASP.NET Web API verwendet Content-Negotiation, um eine eingehende HTTP-Anforderung in eine Modellklasse deserialisieren. Standardmäßig funktioniert dies mit jeder XML-, JSON- oder wwww-form-urlencoded-Nachricht.

public class ComputerController : ApiController 
{ 
    public void Post(ComputerInfo computer) 
    { 
     // use computer argument 
    } 
} 

eine Modellklasse erstellen, die auf die Eigenschaften des XML abbildet.

public class ComputerInfo 
{ 
    public string Processor { get; set; } 
    public string HardDrive { get; set; } 
} 

Diese eingehende XML würde den Computer-Parameter in der Post-Methode, um Hydrat werden deserialisiert.

<ComputerInfo> 
    <Processor>AMD</Processor> 
    <HardDrive>Toshiba</HardDrive> 
</ComputerInfo> 

Wenn Sie aus irgendeinem Grund manuell lesen möchten und die eingehende XML zu analysieren, Sie so wie diese

string incomingText = this.Request.Content.ReadAsStringAsync().Result; 
XElement incomingXml = XElement.Parse(incomingText); 
+0

Verwenden von ReadAsStreamAsync und Load ist eine bessere Option als ReadAsString und Parse. –

+0

@DarrelMiller Warum ist das? – Despertar

+0

Da ReadAsString eine andere Zeichencodierung als im XML-Dokument definiert auswählen kann. –

4

Alle eingehenden Inhalte können als Stream von Bytes gelesen werden tun können, und dann verarbeitet wie erforderlich.

public async Task<HttpResponseMessage> Get() { 

    var stream = await Request.Content.ReadAsStreamAsync(); 

    var xmlDocument = new XmlDocument(); 
    xmlDocument.Load(stream); 

    // Process XML document 

    return new HttpResponseMessage(); 
} 
+2

"Ein Strom von Bytes" - aus irgendeinem Grund denke ich an einen Piranha-befallenen Teil des Orinoco. Ernsthafter, obwohl ich eine verwandte Frage an http://stackoverflow.com/questions/21994108/how-can-i-read-an-xml-file-in-a-web-api-app gepostet habe –