2012-09-24 12 views
32

In einer meiner Get-Anforderung möchte ich eine HttpResponseMessage mit Inhalt zurückgeben. Derzeit habe ich es wie folgt funktioniert:Web API: Inhalt in HttpResponseMessage

var header = new MediaTypeHeaderValue("text/xml"); 
Request.CreateResponse(HttpStatusCode.OK, myObject, header); 

Da ich jedoch die statische Anfrage verwenden, wird dies wirklich schwierig zu testen. Von dem, was ich gelesen habe, soll ich in der Lage sein, Folgendes zu tun:

return new HttpResponseMessage<T>(objectInstance); 

scheint jedoch nicht in der Lage zu sein, dies zu tun. Liegt es daran, dass ich eine ältere Version von WebApi/.NET verwende?


Auf einer Seite zur Kenntnis, fand ich, dass Sie möglicherweise eine Antwort erstellen könnte wie folgt aussehen:

var response = new HttpResponseMessage(); 
response.Content = new ObjectContent(typeof(T), objectInstance, mediaTypeFormatter); 

Was mich verwirrt ist, warum muss ich hier eine mediaTypeFormatter hinzuzufügen. Ich habe den Medientyp-Formatierer auf der globalen.asax-Ebene hinzugefügt.

Danke!

+0

Sie müssen übergeben die Formatierungs lesen, weil sonst würde ObjectContent ein statisches Element zu verwenden, die globale Sammlung zuzugreifen, die Prüfung schwieriger machen würde. –

+0

Anfrage ist nicht statisch, es ist ein Instanzmitglied von ApiController. –

Antwort

60

HttpResponseMessage<T> wurde nach Beta entfernt. Gerade jetzt, anstelle einer typisierten HttpResponseMessage haben wir eine typisierte ObjectContent

Wenn Sie manuell erstellen HttpResponseMessage seine Standardparameterlos Konstruktor verwenden, gibt es keinen Anforderungskontext zur Verfügung Inhalt Verhandlung durchführen - das ist, warum Sie den Formatierer angeben müssen, oder führen Inhaltsverhandlung von Hand.

Ich verstehe Sie nicht wollen, das zu tun - so verwenden Sie stattdessen:

HttpResponseMessage response = Request.CreateResponse<MyObject>(HttpStatusCode.OK, objInstance); 

, dass die Antwortnachricht die sich auf den Inhalt Verhandlung gegen den Antrag ausgeführt schaffen würde.

Schließlich können Sie mehr über Content-Negotiation hier On this link

+4

Ich vermisse die HttpResponseMessage , ich denke, es war eine bessere API, aber Request.CreateResponse funktioniert gut. – Hugo

+3

Denken Sie daran, dass jede Controller-Methode, die 'HttpResponseMessage' verwendet, sehr schwierig zu testen ist. Daher sollten Sie sie möglichst nicht verwenden. –

+7

@RoyDictus Ich bin neugierig, warum es Komponententests schwierig macht, könnten Sie bitte erläutern? –

Verwandte Themen