2014-11-21 62 views
3

我正在創建一個Azure移動服務,它使用了一個使用TableController(ApiController的子類)來處理REST請求的.NET後端。防止用.NET中的PATCH覆蓋某些字段Azure Web API

在我的PATCH方法中,我想限制允許更新的字段集合。我有一個帳戶控制器,我不希望字段UsernameUserId被覆蓋。

public class AccountController : TableController<Account> 
{ 
... 
// PATCH tables/TodoItem/48D68C86-6EA6-4C25-AA33-223FC9A27959 
    public Task<Account> PatchAccount(string id, Delta<Account> patch) 
    {    
      return UpdateAsync(id, patch);   
    } 
... 
} 

我想,如果連接到API客戶端嘗試更新的用戶名或用戶id發回像403: Forbidden或類似有意義的HTTP響應。所以我需要一些方法來知道Delta補丁的內容,或者在'禁止'字段正在更新時有自動響應。

回答

2

不知道是否有內置的方式來做到這一點。但是,您可以解決此問題。創建新的屬性,比如NonEditable

public class NonEditableAttribute: Attribute 
{ 
} 

將此屬性應用到您不希望修補的屬性。

public class Account 
{ 
    [NonEditable] 
    public string UserName {get;set;} 

    ... other properties 
} 

寫了一些輔助方法,將檢查是否在Delta<T>更改的屬性包含任何這些非可編輯的屬性。

public bool IsValidDelta<T>(Delta<T> delta) where T: class 
{ 
    // list of property names that can't be patched 
    var nonEditablePropertyNames = from p in typeof(T).GetProperties() 
        let attr = p.GetCustomAttribute(typeof(NonEditableAttribute)) 
        where attr != null 
        select p.Name; 
    // list of property names that were changed 
    var changedPropertyNames = delta.GetChangedPropertyNames(); 

    // check if changedPropertyNames contains any of propertyNames, 
    // if yes return false, if no return true; 
} 

現在,在ApiController,只是檢查是否Delta<T>包含更改的屬性,不可編輯

public class AccountController : TableController<Account> 
{ 
... 
// PATCH tables/TodoItem/48D68C86-6EA6-4C25-AA33-223FC9A27959 
    public Task<Account> PatchAccount(string id, Delta<Account> patch) 
    {  
     if(IsValidDelta(patch))   
      return UpdateAsync(id, patch);   
     else 
      // forbidden... 
    } 
... 
} 

請注意:代碼沒有進行測試,並且可以更好的設計。這是給你一個普遍的想法 - 把它當作僞代碼。