2013-09-21 27 views
1

我已經實現的Web API類這樣:實現Web Api控制器 - 爲什麼使用IDisposable會干擾路由?

public class ControllerCore : ApiController 
{ 
    ...do some basic things... 
} 

,然後在派生類中有:

public class LoginController : ControllerCore 
{ 
    public HttpResponseMessage Get() 
    { 
     // Get login status 
    } 

    public HttpResponseMessage Post([FromBody]LoginParams login) 
    { 
     // Do actual log in 
    } 
} 

這一切工作正常。不過,我想喜歡使ControllerCore一次性這樣我就可以創建和清除包含開放式數據庫連接管理對象:

public class ControllerCore : ApiController, IDisposable 
{ 
    protected DataAccess DAL; 
    private bool isDalDisposed; 

    public ControllerCore() 
     : base() 
    { 
     DAL = new DataAccess(); // opens a connection that will have to be cleaned up 
     isDalDisposed = false; 
    } 

    public new void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    protected override void Dispose(bool disposing) 
    { 
     if (!isDalDisposed) 
     { 
      isDalDisposed = true; 
      if (disposing) 
       DAL.Dispose(); 
     } 
     base.Dispose(disposing); 
    } 

    ...other code here... 
} 

的問題是,雖然在LoginController中「獲取」仍然有效,但「郵政」永遠不會被稱爲 - 路線似乎沒有工作。由於唯一的區別是郵政有參數,我想知道是否以某種方式一次性修改搞亂從JSON到LoginParams對象的轉換。

任何幫助將大大讚賞!

+4

由於ApiController已經實現了IDisposbale接口,所以你的子類可以重寫基類的Dispose方法......爲什麼你想要再次實現IDisposable接口?只是FYI ...你可以參考類繼承的指導和處置行爲在這裏:http://msdn.microsoft.com/en-us/library/system.idisposable.aspx –

回答

7

我的猜測是來自Web API的響應是:找到了與請求匹配的多個操作。

由於您的控制器有兩個匹配Post請求的方法,Web API路由會變得混亂。 缺省情況下,您的API控制器上的任何公共方法都與用於選擇操作方法的任何規則不匹配,都被視爲Post方法。 您可以找到有關主題here的更多信息。

要解決您的問題,只需在您的Dispose方法中添加[NonAction]屬性,以便Web API將其忽略。

+0

非常感謝你的答案!當你這麼說的時候,說實話很有道理,但我仍然習慣了路線匹配規則,並沒有想到「Dispose」可以被看作是一個Action。 –

+4

您不應該隱藏公共Dispose方法。基類已經有了所有必要的邏輯。你所有的清理邏輯都應該在覆蓋保護的Dispose方法中。控制器已經實現了IDisposable接口。 –

相關問題