2013-05-21 15 views
34

Ich habe eine Methode, die eine HttpResponseMessage erstellt, die ein Error-Objekt enthält, das basierend auf dem aktuellen Anforderungstyp Medientyp-Formatierer zurückgegeben wird.Wie kann global auf das aktuelle HttpRequestMessage-Objekt zugegriffen werden?

Momentan habe ich den XmlMediaTypeFormatter fest programmiert, aber ich möchte die aktuelle Anfrage MediaTypeFormatter zur Laufzeit finden, aber ich habe keinen Zugriff auf das aktuelle Anfrageobjekt, da mein unterer Code in einer separaten Klassenbibliothek existiert.

private HttpResponseMessage Create(HttpStatusCode statusCode, string errorCode, string errorMessage) 
{ 
    var result = new HttpResponseMessage(statusCode) 
     { 
      Content = new ObjectContent<Error>(new Error() 
      { 
       Code = errorCode, 
       Message = errorMessage 
      }, new XmlMediaTypeFormatter()) 
     }; 
    return result; 
} 

Wie global auf das aktuelle HttpRequestMessage-Objekt zugreifen? etwas wie HttpContext.Current.Request

Wenn unmöglich, wie die obige Methode zu implementieren, so dass es weiß, welche Formatierung es für die aktuelle Anforderung verwenden sollte?

+1

Warum übergeben Sie keine 'HttpRequestMessage' an Ihren' XmlMediaTypeFormatter'? Wenn Sie sagen, dass sich Ihr Formatierer in einer anderen Bibliothek befindet, sollten Sie ihn besser nicht mit Ihrer Anwendung verknüpfen. – polkduran

+0

Danke, ich benutze keinen benutzerdefinierten Formatierer. Ich hatte gehofft, ich könnte vermeiden, die Eigenschaft Controller Request zu übergeben. –

+0

Endlich habe ich die Anfrage bestanden, da es keine bessere Lösung gab. –

Antwort

2

Warum nicht tun, was das Web-API-Team mit ihrer CreateResponse-Methode gemacht hat? Machen Sie es zu einer Erweiterungsmethode des Controllers. Auf diese Weise können Sie den Code immer noch in einer separaten Klassenbibliothek haben, aber Ihre Methode hat Zugriff auf die Controller-Instanz und somit auf alle Konfigurationsinformationen.

Und etwas anderes würde ich vorschlagen, dass Sie einige der Standardisierungsbemühungen für Fehlerreaktionen untersuchen, anstatt Ihre eigenen zu erfinden.

z.B .:

+2

hmm, Wie bekomme ich die Controller-Instanz zur Laufzeit von einer separaten Klasse? glaube nicht, dass dein Vorschlag verwendet werden kann. –

+0

Hallo, danke für diesen Beitrag. Können Sie auf dieser Distanz ein Update anbieten, ob sich etwas durchgesetzt hat und/oder ob es als Idee (oder etwas anderes) verdrängt wurde? –

60

Es ist nicht unmöglich, wie ich aus erst vor kurzem gefunden. Es ist tatsächlich in der Eigenschaft Items des aktuellen Httpcontext hinzugefügt (falls vorhanden) = [

HttpRequestMessage httpRequestMessage = HttpContext.Current.Items["MS_HttpRequestMessage"] as HttpRequestMessage 

Edit:

Dies ist ab WebAPI v2 .. Ich kann nicht sicher vorhergehender Versionen sein.

+4

Es ist nicht in WebAPI v1. – SeriousM

+2

Ist das in Ordnung? Fühlt sich komisch an, aber ich kann nicht erklären, warum ... – Magrangs

+0

@Magrangs, wenn Sie WebAPI 2 dann ja verwenden, ist es in Ordnung. Die ASP-Pipeline speichert das Nachrichtenobjekt auf dem aktuellen httpcontext. Sie können selbst in eine Sitzung debuggen und die verschiedenen Schlüssel in 'HttpContext.Current.Items' überprüfen. Beachten Sie, dass sich dies in zukünftigen Versionen von WebAPI ändern könnte. – dariusc

Verwandte Themen