2014-02-05 2 views
6

für meine WebAPI OData-Anwendung, ich versuche, meinem Client (Browser) die Entscheidung zu geben, welches Format die Datenausgabe sein sollte. als $ format ist noch nicht in WebAPI OData, im mit Raghuramn dem Beispiel hier umgesetzt: https://gist.github.com/raghuramn/5556691

var queryParams = request.GetQueryNameValuePairs(); 
var dollarFormat = queryParams.Where(kvp => kvp.Key == "$format").Select(kvp => kvp.Value).FirstOrDefault(); 

if (dollarFormat != null) 
{ 
    request.Headers.Accept.Clear(); 
    request.Headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse(dollarFormat)); 

    // remove $format from the request. 
    request.Properties[HttpPropertyKeys.RequestQueryNameValuePairsKey] = queryParams.Where(kvp => kvp.Key != "$format"); 
} 

Dies funktioniert für JSON ($ format = application/json; OData = fullmetadata) und JSON-Licht (Format = application/json; odata = light) aber bisher nicht für xml.

Wenn ich $ format = application/XML zum querystring hinzufüge, gibt es noch zu json Licht aus. Wie erzwinge ich XML-Ausgabe?

EDIT:

auch wenn ich Kraft xml in Fiddler durch Senden Content-type: application/xml und Accept: application/xml mit der Bitte, die Antwort einfach Listen: Inhaltstyp: application/json; odata = minimale Metadaten; Streaming = wahr; charset = UTF-8

EDIT 2:

Accept: application/atom + xml ist in der rohen Reaktion auf Ausgabe xml scheinen. Leider wirft, "application/atom + xml" eine Format in:

request.Headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse("application/atom+xml")); 
+0

Haben Sie 'text/xml' probiert? – Markus

+0

ja, dass auch json ... – stefjnl

+0

FYI, Raghuramn Beispiel wird fehlschlagen, wenn Sie die $ format = application/atom + xml querystring, da der Wert von dollarFormat wird "application/atom xml", ergibt sich die "+" in die URL – Schandlich

Antwort

3

die Anfrage Content Einstellung anstelle des AcceptHeader der Trick:

request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/atom+xml"); 
+2

Funktioniert nicht für mich. Können Sie mir bitte sagen, welche Versionen von Web-API und OData-Bibliotheken Sie verwenden? Ich verwende Web API 2.2 (5.2.2 Assembly Version) und OData lib v. 6.7.0. –

+0

Hallo, @stefjnl - wenn möglich, würde ich gerne Ihren Client-Code sehen (z. B. wenn Sie Jquery Ajax verwendet, um die Anfrage zu formulieren ... wie sah es aus?) – bkwdesign

0

Dank einer Suche auf den Schlüsselwörtern request.Headers.Accept.Add und MediaTypeWithQualityHeaderValue die von dieser Frage vorgestellt wurden, fand ich eine CodeProject Article, die tatsächlich die Syntax präsentierte, um den Accept-Header korrekt hinzuzufügen und dasselbe Problem zu lösen:

this.Request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/atom+xml")); 

anstelle von MediaTypeWithQualityHeaderValue.Parse("application/atom+xml"), die die FormatException auslöst.