2013-02-06 7 views
6

समस्या क्या है?माइक्रोसॉफ्ट एएसपी.NET वेब एपीआई ओडाटा से डेल्टा <T> का उपयोग कैसे करें कोड के साथ पहले JsonMediaTypeFormatter

मैं अपने एएसपीनेट वेब एपीआई ऐप में पैचिंग सक्षम करने की कोशिश कर रहा हूं। मैं कोड पहली इकाई ढांचे का उपयोग कर रहा हूँ।

[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 फ़ॉर्मेटर के साथ एक समस्या हो रहा है लेकिन 2 कड़ी में फिलिप ऐसा लगता है कि इसे oDataMediaTypeFormatter के बिना काम करना चाहिए।

मैंने अपने मॉडल को ईडीएमएक्स प्रतिनिधित्व में क्रमबद्ध करने की कोशिश करने की लाइन शुरू कर दी है, फिर वहां से सीएसडीएल निकालने के लिए, इसलिए मैं एक ओडाटामीडिया टाइपइपॉर्मेटर बना सकता हूं, लेकिन मैंने वहां भी एक स्नैग मारा है, और यह थोड़ा अधिक लगता है।

यदि कोई इस पर कोई प्रकाश डाल सकता है तो इसकी बहुत सराहना की जाएगी। अगर मुझे और जानकारी की आवश्यकता है तो मुझे बताएं।

संपादित करें:

यहाँ SimpleFormGroup के लिए वर्ग परिभाषा है:

Content-Type: 'application/json' 

{ "DisplayOrder" : "20 } 

धन्यवाद, पीट

+0

क्या आप सरलफॉर्म समूह और जेएसओएन के लिए क्लास परिभाषा जोड़ सकते हैं जिसे आप पैच के अनुरोध में भेज रहे हैं? –

+0

ऊपर देखें ... मुझे इस पल के लिए वास्तव में एक कामकाज मिला है, लेकिन मुझे आपके विचारों को भी सुनना होगा –

+0

यह 20 के बाईं ओर उद्धरण पर विचार करने के लिए वैध JSON नहीं है। क्या वहां कोई समापन उद्धरण है मूल्य या कोई उद्घाटन उद्धरण? – Rich

उत्तर

8
: यहाँ

public class SimpleFormGroup 
{ 
    public int LastUpdate; 

    public string Identifier; 

    public string Title; 

    public int DisplayOrder; 
} 

और डेटा है कि मैं भेज रहा हूँ है

दिलचस्प, यहजैसा दिखता है Int सदस्यों के साथजेएसओएन में काम नहीं करता है।

दुर्भाग्यवश, Delta<T> विशेष रूप से ओडाटा के लिए बनाया गया था। यदि Delta<T> ओडाटा के अलावा किसी भी फॉर्मेटर के साथ काम कर रहा प्रतीत होता है, तो यह जानबूझकर होने के बजाय एक संयोग है।

अच्छी खबर यह है कि JSON के लिए अपने स्वयं के पैच प्रारूप को परिभाषित करने से आपको कुछ भी रोक नहीं रहा है, और मुझे आश्चर्य होगा कि कोई भी पहले से ही लिखा नहीं है जो जेसन.NET के साथ बेहतर काम करता है। यह संभव है कि हम वेब एपीआई की भावी रिलीज में पैचिंग का पुनरीक्षण करेंगे और एक निरंतर कहानी के साथ आने की कोशिश करेंगे जो प्रारूपकों में काम करता है।

+3

का उपयोग करके एक सहायक डेल्टा का उपयोग करने के लिए केवल ओडीटा से ही नहीं बल्कि सामान्य रूप से वेब एपीआई से फायदेमंद। यह हर बार मुझे परेशान करता है जब मैं एक पैच() क्रिया करता हूं जो आंशिक अद्यतन करने के लिए सबमिटकर्ता के अलग ज्ञान पर निर्भर करता है :(क्या कोडप्लेक्स पर कोई समस्या है जिसे हम आवश्यकता को वैध बनाने में सहायता के लिए वोट दे सकते हैं? –

+3

यह एक अच्छी जगह है शुरू करें: http://aspnetwebstack.codeplex.com/workitem/777। –

+3

मैंने देखा कि यह JSON के लिए * int * और * guid * पर चोक करता है। मैंने यहां एक वर्कअराउंड पोस्ट किया है http://www.strathweb.com/2013/01/आसान-एएसपी-नेट-वेब-एपीआई-रिसोर्स-अपडेट-डेल्टा /। संक्षेप में, JSON.NET स्ट्रिंग के रूप में लंबे समय तक और ग्रिड का इलाज करेगा, इसलिए डेल्टा कोड को इसके विरुद्ध ढाल की आवश्यकता है, –

4

यूसुफ के लिए धन्यवाद और यह पता लगाने के लिए धन्यवाद कि चीजें क्यों काम नहीं कर रही हैं। उम्मीद है कि लाइन को हल कर सकते हैं।

मैं ओडाटा पैकेज स्रोत पर पोरिंग के बाद अंत में इसे क्रैक करने में कामयाब रहा। मैंने एक और मीडियाटाइपफॉर्मेटर को कार्यान्वित करना चुना जो तर्क को लपेटता है क्योंकि यह आसान पहुंच टियो एचटीपीकंटेंट प्रदान करता है, लेकिन इसे प्राप्त करने के अन्य तरीके भी हैं।

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; 
} 

आशा इस कोई कुछ परेशानी की बचत होती है:

महत्वपूर्ण हिस्सा पता लगाना था कि कैसे कोड पहला मॉडल व्याख्या करने के लिए नीचे दिए गए टिप्पणी की लाइन को देखने के!

संबंधित मुद्दे