2010-09-23 130 views
2

我有一個非常簡單的WCF數據服務應用程序,我正在做一些基本的CRUD操作。對於正在更改的實體集,我有ChangeInterceptor,但ChangeInterceptor中的對象是數據庫中的當前狀態,而不是HTTP PUT中發送的內容。 有沒有辦法在保存之前驗證對象的屬性?我可以在保存更改之前驗證實體嗎?

這裏是我的ChangeInterceptor:

[ChangeInterceptor("People")] 
public void OnChangePerson(Person personChanging, UpdateOperations updateOperations) { 
    switch (updateOperations) { 
     case UpdateOperations.Change: 
      // personChanging is the database version here, not the changed version. 
      break; 
     default: 
      break; 
    } 
} 

這裏是我的客戶端代碼(jQuery的):

var data = { 
    FirstName: "NewFN", 
    LastName: "NewLN" 
}; 
$.ajax({ 
    type: "PUT", 
    url: serviceUrl + "/People(" + personID + ")", 
    contentType: "application/json", 
    dataType: "json", 
    data: JSON.stringify(data), 
    success: function (data) { 
     alert("Success!"); 
    }, 
    error: function (error) { 
     alert("An error occured"); 
    } 
}); 

這裏是JSON被髮送到服務器: alt text

以下是收到消息時的ChangeInterceptor: alt text

我已經上傳的代碼爲這個項目在這裏:http://andyjmay.com/test/2921612/ODataTest.zip

+0

+1 for include source。 – jfar 2010-09-27 03:25:21

回答

1


我下載了您的示例,重新解決了您的問題,並能夠使用此解決方案查看最新更新值。
雖然我在內部調查了這個問題,但是您可以更改代碼以使用合併動詞而不是PUT嗎?
通過此更改,您現在應該可以在通過jQuery客戶端更新值時看到最新的實體值傳入ChangeInterceptors。

$.ajax({
beforeSend: function (xhrObj) {
xhrObj.setRequestHeader("X-Http-Method", "MERGE");
},
type: "POST",
url: serviceUrl + "/People(" + personID + ")",
contentType: "application/json",
dataType: "json",
data: JSON.stringify(data),
success: function (data) {
GetAllPeople();
},
error: function (error) {
alert(error);
}
});

+0

非常感謝!這是WCF數據服務和EF的問題,還是這種預期的行爲?我剛剛開始使用WCF數據服務,如果可能,我想遵循最佳做法。 – 2010-09-28 13:16:55

+0

嗨,Andy,這是WCF數據服務服務器運行時中的一個錯誤。 我們似乎將過時的值傳遞給用戶運行時並在內部使用客戶端發送的最新值。 如果您想驗證PUT的值,請考慮在ObjectContext上重寫SaveChanges方法並在其中進行驗證。以下是此方法的MSDN文檔:http://msdn.microsoft.com/en-us/library/bb336792.aspx – 2010-09-28 14:11:02

1

WCF得到了一些很好的擴展,你可以編寫MessageInspector和ParameterInspector。 我確定其中的一個人可以幫助您在服務器開始處理請求之前驗證內容。

0

嗯...你說personChanging是數據庫版本,它肯定應該是更新後的版本。

我的測試(和產品團隊中的人)告訴我,它應該是通過電線傳輸的版本。其他事情可能會出錯嗎?

例如,您的財產可以是名字而不是名字?

+0

根據此(msdn.microsoft.com/en-us/library/dd744842.aspx)您是正確的,該參數應該是發送的。但事實並非如此。此外,屬性名稱是正確的,更新的作品,我只是無法驗證它。我在這裏上傳了我的測試項目:http://andyjmay.com/test/2921612/ODataTest.zip – 2010-09-24 12:53:32

1

如果服務是基於EF的,並且請求是PUT,那麼將提供舊值(這與EF提供程序的實現方式有關,可能是一個錯誤,我們將進一步研究) 。您可以通過發送MERGE請求來解決此問題。我證實,在那種情況下,它按預期工作(你會得到新的值)。 MERGE有一些不同的語義,但它可能適用於你。 PUT會覆蓋實體,所以如果您沒有爲給定屬性發送值,它將被重置爲默認值。 MERGE只用來自有效載荷的值修改現有的實體,所以如果某個屬性不在有效載荷中,它的值將保持不變。

相關問題