2013-12-19 13 views
8

私はApiControllerのリクエスト処理メソッド内でこのコードを持っている:Request.CreateResponse()からHttpResponseExceptionを処分する必要がありますか?

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

潜在的な問題は、「r」が配置されないことである(私のコードでは少なくとも)。
これを使用して折り返すことはできますが、レスポンスがクライアントにストリーミングされる前に "r"が処分されませんか?

これを処理する正しい方法は何ですか?

+2

それは、彼らが自分のクラスをこのように構造化するであろうことは興味深いです。私はドキュメントで役立つものは何も見つかりませんでしたが、[this constructor](http://msdn.microsoft.com/en-us/library/hh835324(v=11118).aspx)代わりに状態コード? –

+0

"はあまり早く処分されないでしょうか?"何かのために早すぎる、正確に? – spender

+2

@spender、私は、OPがクライアントに応答をストリーミングできるようになる前にそれが処分されると述べていると思います。 –

答えて

5

すべてexamples私はあなたがレスポンスを廃棄する必要がないことを見てきました。 HttpResponseExceptionにソースコードを見てみると

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; 
} 

、その値を持つプロパティ(HttpResponseMessage Response)を移入し、それを処分することは、おそらくどちらかHttpResponseMessageを引き起こす説明ObjectDisposedExceptionが発生したり、クライアントに配信することができないだろうと思われます。

また、ソースコードにSupressMessageがあることがわかります:

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

インスタンスを別の場所(これは、それはIDisposableインターを実装していない、HttpResponseMesssageに言及されていない)で配置されています。

これを処理する正しい方法は何ですか?

あなたのコードを変更する必要はありません。

1

私の場合、「インスタンスは他の場所に配置されています」という意味では、対処する必要はありません。

私のソリューションはRegisterForDisposeあるので、それは次のようになります。

HttpResponseMessage r = Request.CreateResponse(HttpStatusCode.Redirect); 
r.Headers.Location = uri; 
this.request.RegisterForDispose(r); 
throw new HttpResponseException(r); 
関連する問題