2013-02-06 16 views
6

問題是什麼?如何使用來自Microsoft ASP.NET Web API OData的Delta <T>與Code First JsonMediaTypeFormatter

我想在我的ASP.net web api應用程序中啓用修補程序。我使用代碼第一個實體框架。

我有,我可以在設置一個斷點下面的方法頭,它會擊中:

[AcceptVerbs("PATCH")] 
public async Task<HttpResponseMessage> Patch(long appId, long id, Delta<SimpleFormGroup> formGroup) 

然而,當我打電話formGroup.Patch(實體),沒有任何修改,我的實體作出。如果我把以下內容放到直接窗口中:

formGroup.GetChangedPropertyNames() 

然後這個集合是空的,這看起來是錯誤的。

我試過了什麼?

我一直在參照下面的例子

http://techbrij.com/http-patch-request-asp-net-webapi http://www.strathweb.com/2013/01/easy-asp-net-web-api-resource-updates-with-delta/

這似乎是使用JSON的MediaType格式化一個問題不知道如何正確地構建增量對象,然而在第二連桿filip似乎暗示它應該在沒有oDataMediaTypeFormatter的情況下工作。

我已經開始嘗試將我的模型序列化到EDMX表示,然後從那裏提取CSDL,所以我可以創建一個oDataMediaTypeFormatter,但我也遇到了一個障礙,再加上它似乎有點矯枉過正。

如果任何人都可以擺脫這一點,它將不勝感激。讓我知道是否需要更多信息。

編輯:

下面是SimpleFormGroup類的定義:

public class SimpleFormGroup 
{ 
    public int LastUpdate; 

    public string Identifier; 

    public string Title; 

    public int DisplayOrder; 
} 

這裏是我發送的數據:

Content-Type: 'application/json' 

{ "DisplayOrder" : "20 } 

謝謝,皮特

+0

您可以爲SimpleFormGroup添加類定義,並將請求中發送的JSON添加到PATCH中? –

+0

請參見上面...我實際上已經找到了解決此問題的一個解決方法,但是我也希望能夠聽到您的想法 –

+0

考慮到20左側的引用,這不是有效的JSON。價值還是沒有開盤報價? – Rich

回答

8

有趣,它看起來像帶int成員的在JSON中不起作用。

不幸的是,Delta<T>是專門爲OData創建的。如果Delta<T>似乎與OData以外的任何格式化程序一起工作,這是巧合,而不是故意的。

好消息是,沒有什麼能夠阻止您爲JSON定義自己的PATCH格式,如果沒有人已經編寫出可以與Json.NET更好地協作的應用程序,我會感到驚訝。我們可能會在未來的Web API版本中重新審視修補程序,並嘗試提出一個貫穿格式化程序的一致性故事。

+3

有一個可支持的Delta ,不僅用於OData,而且通常來自Web API,有利。每次我創建一個依賴於提交者的離散知識來執行部分更新的Patch()操作時,我都感到難過:在codeplex上我們可以投票來幫助合法化需求嗎? –

+3

這是一個很好的地方開始:http://aspnetwebstack.codeplex.com/workitem/777 –

+3

我注意到它在* int *和* guid *爲JSON的扼流圈我在這裏發佈了一個解決方法http://www.strathweb.com/2013/01/easy-asp-net-web-api-resource-updates-with-delta /。簡而言之,JSON.NET會將int看作long和Guid作爲字符串,所以Delta 代碼需要屏蔽, –

4

感謝優素福調查和發現爲什麼不起作用。希望能夠解決問題。

我仔細研究了oData軟件包源,最後自己破解了這個。我選擇實現另一個包裝邏輯的MediaTypeFormatter,因爲它提供了輕鬆訪問tio HttpContent的方法,但還有其他方法可以實現此目的。

的關鍵部分就是如何解釋代碼第一種模式,請參閱下面的註釋行:

public override Task<object> ReadFromStreamAsync(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger) 
{ 
    var builder = new ODataConventionModelBuilder(); 

    // This line will allow you to interpret all the metadata from your code first model 
    builder.EntitySet<EfContext>("EfContext"); 

    var model = builder.GetEdmModel(); 
    var odataFormatters = ODataMediaTypeFormatters.Create(model); 
    var delta = content.ReadAsAsync(type, odataFormatters).Result; 

    var tcs = new TaskCompletionSource<object>(); 
    tcs.SetResult(delta); 
    return tcs.Task; 
} 

希望這樣可以節省別人有些麻煩!

相關問題