2013-12-19 10 views
8

Ich habe diesen Code innerhalb eines Anforderungshandhabungsverfahrens eines ApiController:Muss ich eine HttpResponseException von Request.CreateResponse() entfernen?

if (uri != null) 
{ 
    HttpResponseMessage r = Request.CreateResponse(HttpStatusCode.Redirect); 
    r.Headers.Location = uri; 
    throw new HttpResponseException(r); 
} 

Das mögliche Problem besteht darin, dass „r“ wird nie angeordnet (in meinem Code zumindest).
Ich könnte dies in eine Verwendung wickeln, aber dann würde nicht "r" entsorgt werden, bevor die Antwort an den Client gestreamt wird?

Was ist der richtige Weg, damit umzugehen?

+2

Es ist interessant, dass sie ihre Klasse auf diese Weise strukturieren würde. Ich konnte nichts hilfreiches in den Dokumenten finden, aber Sie können einfach [diesen Konstruktor] (http://msdn.microsoft.com/en-us/library/hh835324 (v = vs.118) .aspx) verwenden ein Statuscode stattdessen? –

+0

"würde nicht zu früh entsorgt werden?" Zu früh für was genau? – spender

+2

@spender, ich denke, das OP gibt an, dass es entsorgt werden würde, bevor die Antwort an den Client gestreamt werden könnte. –

Antwort

5

Alle examples Ich habe gesehen, dass Sie nicht über die Antwort verfügen müssen.

public Product GetProduct(int id) 
{ 
    Product item = repository.Get(id); 
    if (item == null) 
    { 
    var resp = new HttpResponseMessage(HttpStatusCode.NotFound) 
    { 
     Content = new StringContent(string.Format("No product with ID = {0}", id)), 
     ReasonPhrase = "Product ID Not Found" 
    } 
    throw new HttpResponseException(resp); 
    } 
    return item; 
} 

Mit Blick auf dem Quellcode zu HttpResponseException, es scheint, dass es eine Eigenschaft (HttpResponseMessage Response) mit diesem Wert auffüllt und wahrscheinlich die HttpResponseMessage würde die Entsorgung verursacht entweder eine ObjectDisposedException verursachen oder nicht an den Kunden geliefert werden.

Sie werden auch bemerken, dass in den Quellcode gibt es ein SupressMessage:

[SuppressMessage("Microsoft.Reliability", 
    "CA2000:Dispose objects before losing scope", 
    Justification = "Instance is disposed elsewhere")] 

Instanz ist von anderer Stelle angeordnet sind (dies bezieht sich nicht auf HttpResponseMesssage, es nicht IDisposable implementieren).

Wie ist der richtige Umgang damit?

Ich glaube nicht, dass eine Änderung an Ihrem Code erforderlich ist.

1

Für mich ist "Instanz an anderer Stelle angeordnet" bedeutet nicht, dass Sie nicht damit umgehen müssen.

Meine Lösung ist RegisterForDispose so wird es:

HttpResponseMessage r = Request.CreateResponse(HttpStatusCode.Redirect); 
r.Headers.Location = uri; 
this.request.RegisterForDispose(r); 
throw new HttpResponseException(r); 
Verwandte Themen