2016-04-01 35 views
2

我在所有Wep Api 2控制器上爲Options()動詞獲取了CA2000錯誤。如何在Web Api方法中配置HttpResponseMessage?

在方法'PromotionController.Options()'中,對象'<> g__initLocal0'沒有沿着所有異常路徑放置。

我需要支持跨域AJAX做飛行前的請求調用,因此所有我做的是返回HttpStatusCode.Ok從而使隨後的後/ PUT /刪除將火熄滅。

public HttpResponseMessage Options() 
{ 
    return new HttpResponseMessage { StatusCode = HttpStatusCode.OK }; 
} 

我曾嘗試使用的語句是這樣的:

public HttpResponseMessage Options() 
{ 
    using(var response = new HttpResponseMessage()) 
    { 
     response.StatusCode = HttpStatusCode.OK; 
     return response; 
    } 
} 

但是當我從郵遞員的選項要求打它,我得到一個異常:

無法訪問處理對象。\ r \ n對象名稱:'System.Net.Http.HttpResponseMessage'。

如何以不會拋出代碼分析錯誤的方式返回HttpStatusCode.Ok

謝謝!

+0

好了,爲什麼你不使用Owin/CORS,或CORS的WebAPI? –

+0

請參閱[此前答案](http://stackoverflow.com/questions/11361912/how-do-i-dispose-of-resources-after-an-asp-net-web-api-request-completes)和[這一個](http:// stackoverflow。com/q/27715327/1260204) – Igor

+0

@Igor我在搜索時看到了這篇文章,但從我所看到的,HttpResponseMessage不支持RegisterForDispose。只有HttpRequestMessage可以。 – Elliott

回答

1

關於訪問處置對象的例外很明顯,因爲當執行離開using塊時,response被丟棄,但是您將其從using塊中退出並且不在方法中。您不能在方法外訪問該對象,因爲它不再存在。

一般來說,要解決警告,只需在不再需要的情況下明確處理HttpResponseMessage類的實例。

你的情況的解決方案可能是覆蓋的Dispose method of your controller(實現ApiController法)和明確處置的情況下,有。檢查例如this question

您也可以僅僅禁止警告,並且實例將在稍後被垃圾回收器處理。但這不是一個合適的解決方案。

+0

我希望他們是另一種方式,因爲我討厭壓制警告 – Elliott

+0

是的,我絕對同意和我在伊戈爾對你的問題的評論中鏈接的答案中讀到的內容,你應該至少有兩種可能性 - 控制器的「Dispose」方法和' RegisterForDispose'擴展名。 –

+0

@Elliott我的回答是否幫助你解決了你的問題?如果是的話,你能接受它,以便其他人能夠更容易地找到答案,請?這也可以讓其他人將類似的問題標記爲這個問題的重複。 –

1

您可以使用RegisterForDispose類的HttpRequestMessage類來註冊處理響應對象。 .Net的基礎設施將在處理請求後處理所有註冊對象。

我不能保證您在此後不會得到錯誤,但該對象將被丟棄以便您可以抑制錯誤。

HttpResponseMessage response = Request.CreateResponse(); 
// Do what you need with response 
// ... 
// ... 
request.RegisterForDispose(response);// response will be disposed by host 
相關問題