2012-12-01 24 views
5

मैंने एक एएसपी.नेट एमवीसी 4 वेब एपीआई प्रोजेक्ट बनाया और NuGet के माध्यम से क्लाइंट नमूने समेत ब्रीज़ स्थापित किया और ToDo एप्लिकेशन वास्तव में अच्छी तरह से काम करता है। मेरे पास ऐप एंड्रॉइड टैबलेट पर कॉर्डोवा के माध्यम से वेबएपीआई को कॉल करने वाला ऐप भी है और यह इकाइयों को सहेजते समय भी बहुत अच्छा काम करता है। मैंने क्रॉस डोमेन ऑपरेशंस का समर्थन करने के लिए Global.asax ("एक्सेस-कंट्रोल-ऑब्जेक्ट-ऑरिजन", "*") में उचित परिवर्तन किए हैं।कॉर्डोवा फोन ऐप सेविंग चेंज के साथ ब्रीज़ वेब एपीआई

डेटा क्लाइंट को वास्तव में डेटाबेस में सहेजा जा रहा है जब एंड्रॉइड क्लाइंट इसे सहेजता है चेंज() लेकिन यह असफल वादा हमेशा ग्राहक पर गोलीबारी कर रहा है।

वेब एपीआई सर्वर पर मैंने देखा है कि जब एक ब्राउज़र के माध्यम से हवा में कॉल करने मैं निम्नलिखित उत्पादन का पता लगाने के लिए और सफल सहेजता है:

iisexpress.exe Information: 0 : Operation=ODataActionFilter.ActionExecuting 
iisexpress.exe Information: 0 : Message='Action returned 'Breeze.WebApi.SaveResult'', Operation=ReflectedHttpActionDescriptor.ExecuteAsync 
iisexpress.exe Information: 0 : Message='Will use same 'JsonMediaTypeFormatter' formatter', Operation=JsonMediaTypeFormatter.GetPerRequestFormatterInstance 
iisexpress.exe Information: 0 : Message='Selected formatter='JsonMediaTypeFormatter', content-type='application/json; charset=utf-8'', Operation=DefaultContentNegotiator.Negotiate 
iisexpress.exe Information: 0 : Operation=ApiControllerActionInvoker.InvokeActionAsync, Status=200 (OK) 
iisexpress.exe Information: 0 : Operation=ODataActionFilter.ActionExecuted, Status=200 (OK) 
iisexpress.exe Information: 0 : Operation=BreezeSampleController.ExecuteAsync, Status=200 (OK) 
**iisexpress.exe Information: 0 : Response, Status=200 (OK), Method=POST, Url=http://localhost:59912/api/BreezeSample/SaveChanges, Message='Content-type='application/json; charset=utf-8', content-length=unknown'** 
iisexpress.exe Information: 0 : Operation=JsonMediaTypeFormatter.WriteToStreamAsync 
iisexpress.exe Information: 0 : Operation=BreezeSampleController.Dispose 

लेकिन जब Android एप्लिकेशन से कहा जाता रहा डेटा लिखा मिलता है लेकिन यह त्रुटि एक त्रुटि के साथ:

iisexpress.exe Information: 0 : Message='Action returned 'Breeze.WebApi.SaveResult'', Operation=ReflectedHttpActionDescriptor.ExecuteAsync 
iisexpress.exe Information: 0 : Message='Will use same 'XmlMediaTypeFormatter' formatter', Operation=XmlMediaTypeFormatter.GetPerRequestFormatterInstance 
iisexpress.exe Information: 0 : Message='Selected formatter='XmlMediaTypeFormatter', content-type='application/xml; charset=utf-8'', Operation=DefaultContentNegotiator.Negotiate 
iisexpress.exe Information: 0 : Operation=ApiControllerActionInvoker.InvokeActionAsync, Status=200 (OK) 
iisexpress.exe Information: 0 : Operation=ODataActionFilter.ActionExecuted, Status=200 (OK) 
iisexpress.exe Information: 0 : Operation=BreezeSampleController.ExecuteAsync, Status=200 (OK) 
**iisexpress.exe Information: 0 : Response, Status=200 (OK), Method=POST, Url=http://192.168.1.9:59912/api/BreezeSample/SaveChanges, Message='Content-type='application/xml; charset=utf-8', content-length=unknown'** 
iisexpress.exe Error: 0 : Operation=XmlMediaTypeFormatter.WriteToStreamAsync, Exception=System.Runtime.Serialization.SerializationException: Type 'SMHMobileAPI.Models.BreezeSampleTodoItem' with data contract name 'BreezeSampleTodoItem:http://schemas.datacontract.org/2004/07/SMHMobileAPI.Models' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer. 
    at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeAndVerifyType(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, Boolean verifyKnownType, RuntimeTypeHandle declaredTypeHandle, Type declaredType) 
    at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithXsiType(XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle objectTypeHandle, Type objectType, Int32 declaredTypeID, RuntimeTypeHandle declaredTypeHandle, Type declaredType) 
    at System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerialize(XmlWriterDelegator xmlWriter, Object obj, Boolean isDeclaredType, Boolean writeXsiType, Int32 declaredTypeID, RuntimeTypeHandle declaredTypeHandle) 
    at WriteArrayOfanyTypeToXml(XmlWriterDelegator , Object , XmlObjectSerializerWriteContext , CollectionDataContract) 
    at System.Runtime.Serialization.CollectionDataContract.WriteXmlValue(XmlWriterDelegator xmlWriter, Object obj, XmlObjectSerializerWriteContext context) 
    at System.Runtime.Serialization.XmlObjectSerializerWriteContext.WriteDataContractValue(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle) 
    at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithoutXsiType(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle) 
    at System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerialize(XmlWriterDelegator xmlWriter, Object obj, Boolean isDeclaredType, Boolean writeXsiType, Int32 declaredTypeID, RuntimeTypeHandle declaredTypeHandle) 
    at WriteSaveResultToXml(XmlWriterDelegator , Object , XmlObjectSerializerWriteContext , ClassDataContract) 
    at System.Runtime.Serialization.ClassDataContract.WriteXmlValue(XmlWriterDelegator xmlWriter, Object obj, XmlObjectSerializerWriteContext context) 
    at System.Runtime.Serialization.XmlObjectSerializerWriteContext.WriteDataContractValue(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle) 
    at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithoutXsiType(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle) 
    at System.Runtime.Serialization.DataContractSerializer.InternalWriteObjectContent(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) 
    at System.Runtime.Serialization.DataContractSerializer.InternalWriteObject(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) 
    at System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) 
    at System.Runtime.Serialization.DataContractSerializer.WriteObject(XmlWriter writer, Object graph) 
    at System.Net.Http.Formatting.XmlMediaTypeFormatter.<>c__DisplayClass7.<WriteToStreamAsync>b__6() 
    at System.Threading.Tasks.TaskHelpers.RunSynchronously(Action action, CancellationToken token) 

कुछ क्रमबद्धता त्रुटि के अलावा मैं पोस्ट हेडर "एप्लिकेशन/एक्सएमएल" भी नोटिस करता हूं। मुझे यकीन नहीं है कि यह प्रासंगिक है लेकिन मुझे यकीन है कि अगर कोई मदद कर सकता है तो मुझे समाधान खोजने और ढूंढने में कुछ मदद चाहिए।

धन्यवाद मार्क

उत्तर

4

मैं यकीन है कि "application/xml" प्रासंगिक है कर रहा हूँ।

सहेजने के बाद, ब्रीज़ वेब एपीआई नियंत्रक आपके लिए अपडेट/अतिरिक्त इकाइयां देता है। आपके द्वारा उल्लिखित "स्वीकार करें" हेडर वेब एपीआई को उन इकाइयों को एक्सएमएल फॉर्मेटर के साथ प्रारूपित करने का प्रयास करेगा जो लगभग हमेशा विफल रहता है।

मुझे नहीं लगता कि ब्रीज़ मूल रूप से POST पर एक स्वीकार्य हेडर सेट करता है (मुझे यकीन नहीं है कि यह GET पर स्वीकृति शीर्षलेख सेट करता है)।

आईई 10 में jQuery AJAX जेनरेट अनुरोध पर एक नज़र से पता चलता है कि जीईटी के लिए स्वीकृति हेडर "application/json, text/javascript, */*; q=0.01" है। एक पोस्ट के लिए स्वीकृति और सामग्री-प्रकार शीर्षलेख "*\*" और "application/json" क्रमशः हैं।

अपने Android यातायात में स्वीकार करें हेडर क्या हैं? आप यह निर्दिष्ट नहीं किया जो हैडर "application/xml" स्थापित किया गया था ... लेकिन हमेशा होता है कि जब से "गलत" मैं यह मायने रखता है :)

आप हवा AJAX अनुकूलक को अनुकूलित करने या उसे पूर्ण की जगह as described here कर सकते हैं लगता है नहीं है। आप कोशिश कर सकते हैं:

 
// get the current default Breeze ajax adapter 
var ajaxAdapter = breeze.core.config.getAdapterInstance("ajax"); 
// set fixed headers 
ajaxAdapter.defaultSettings = { 
     headers: { 
      "Accept": "application/json, text/javascript, */*; q=0.01" 
     }, 
};

ऐसा लगता है कि आईई 10 और क्रोम दोनों पर मेरे परीक्षणों में यह चाल चल रही थी।

मैं यह भी सिफारिश करूंगा कि ब्रीज़ वेब एपीआई जेसनफॉर्मेटरएट्रिब्यूट एक्सएमएल फॉर्मेटर को हटा दें, हम जानते हैं कि कोई भी ब्रीज़ यातायात के लिए काम नहीं करता है।

आशा इस काम करता है।

+0

धन्यवाद स्वीकार्य हेडर जोड़कर बहुत अधिक वार्ड काम करता है। मेरे चेहरे पर अब एक बड़ी मुस्कुराहट है अब यह फोनगैप/कॉर्डोवा एंड्रॉइड ऐप देख रहा है, मेरे ईएफ डेटाबेस को .NET वेब एपीआई के माध्यम से अपडेट करें। –

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