使用Cordova手机应用程序保存更改的Breeze Web API
我创建了一个ASP.NETMVC4WebAPI项目,并通过NuGet安装了Breeze,包括客户端示例,ToDo应用程序运行得非常好。我还通过Android平板电脑上的Cordova运行该应用程序,调用WebAPI,除了保存实体外,它的效果也非常好。为了支持跨域操作,我对Global.asax(“Access Control Allow Origin”(“*”)进行了适当的更改 当Android客户端调用其saveChanges()时,数据实际上被保存到数据库中,但它的失败承诺总是在客户端触发 在Web API服务器上,我注意到,通过浏览器进行Breeze调用时,我会得到以下输出跟踪并成功保存:使用Cordova手机应用程序保存更改的Breeze Web API,breeze,Breeze,我创建了一个ASP.NETMVC4WebAPI项目,并通过NuGet安装了Breeze,包括客户端示例,ToDo应用程序运行得非常好。我还通过Android平板电脑上的Cordova运行该应用程序,调用WebAPI,除了保存实体外,它的效果也非常好。为了支持跨域操作,我对Global.asax(“Access Control Allow Origin”(“*”)进行了适当的更改 当Android客户端调用其saveChanges()时,数据实际上被保存到数据库中,但它的失败承诺总是在客户端触发
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)
iisexpress.exe信息:0:Message='Action返回'Breeze.WebApi.SaveResult',Operation=ReflectedHttpActionDescriptor.ExecuteAsync
iisexpress.exe信息:0:Message='将使用相同的'XmlMediaTypeFormatter'格式化程序',操作=XmlMediaTypeFormatter.GetPerRequestFormatterInstance
iisexpress.exe信息:0:Message='Selected formatter='XmlMediaTypeFormatter',content type='application/xml;字符集=utf-8'',操作=DefaultContentCongregator.Congregate
iisexpress.exe信息:0:Operation=ApiControllerActionInvoker.InvokeActionAsync,状态=200(正常)
iisexpress.exe信息:0:操作=ODataActionFilter.ActionExecuted,状态=200(正常)
iisexpress.exe信息:0:Operation=breezSampleController.ExecuteAsync,状态=200(正常)
**iisexpress.exe信息:0:响应,状态=200(确定),方法=POST,Url=http://192.168.1.9:59912/api/BreezeSample/SaveChanges,Message='Content-type='application/xml;字符集=utf-8',内容长度=未知'**
iisexpress.exe错误:0:Operation=XmlMediaTypeFormatter.WriteToStreamAsync,Exception=System.Runtime.Serialization.SerializationException:类型为“SMHMobileAppi.Models.BreezeSampleTodoItem”,数据协定名称为“BreezSampleToDoItem:http://schemas.datacontract.org/2004/07/SMHMobileAPI.Models”他说。考虑使用DATACONTRORTCORDEVER或将未知类型的任何类型添加到已知类型的列表中,例如,使用NoNyType属性或将它们添加到传递给DATACONTROTTRORIGLASER的已知类型列表中。
在System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializationAndVerifyType(DataContract、XmlWriterDelegator、xmlWriter、Object obj、布尔verifyKnownType、RuntimeTypeHandle declaredTypeHandle、Type declaredType)
在System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithXsiType(XmlWriterDelegator xmlWriter,Object obj,RuntimeTypeHandle objectTypeHandle,Type objectType,Int32 declaredTypeID,RuntimeTypeHandle declaredTypeHandle,Type declaredType)
在System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerialization(XmlWriterDelegator xmlWriter、Object obj、Boolean isDeclaredType、Boolean writeXsiType、Int32 declaredTypeID、RuntimeTypeHandle declaredTypeHandle)
在WriteArrayOfanyTypeToXml(XmlWriterDelegator、Object、XmlObjectSerializerWriteContext、CollectionDataContract)的WriteArrayOfanyTypeToXml处
在System.Runtime.Serialization.CollectionDataContract.WriteXmlValue(XmlWriterDelegator xmlWriter、对象obj、XmlObjectSerializerWriteContext上下文)
在System.Runtime.Serialization.XmlObjectSerializerWriteContext.WriteDataContractValue(DataContract DataContract,XmlWriterDelegator xmlWriter,Object obj,RuntimeTypeHandle declaredTypeHandle)
在System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithoutXsiType(DataContract DataContract,XmlWriterDelegator xmlWriter,Object obj,RuntimeTypeHandle declaredTypeHandle)
在System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerialization(XmlWriterDelegator xmlWriter、Object obj、Boolean isDeclaredType、Boolean writeXsiType、Int32 declaredTypeID、RuntimeTypeHandle declaredTypeHandle)
在WriteSavesUltToXML(XmlWriterDelegator、Object、XmlObjectSerializerWriteContext、ClassDataContract)
at System.Runtime.Serialization.ClassDataContract.WriteXmlValue(XmlWriterDelegator xmlWriter、Object obj、XmlObjectSerializerWriteContext上下文)
在System.Runtime.Serialization.XmlObjectSerializerWriteContext.WriteDataContractValue(DataContract DataContract,XmlWriterDelegator xmlWriter,Object obj,RuntimeTypeHandle declaredTypeHandle)
在System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithoutXsiType(DataContract DataContract,XmlWriterDelegator xmlWriter,Object obj,RuntimeTypeHandle declaredTypeHandle)
在System.Runtime.Serialization.DataContractSerializer.InternalWriteObjectContent(XmlWriterDelegator编写器、对象图、DataContractResolver DataContractResolver)
在System.Runtime.Serialization.DataContractSerializer.InternalWriteObject(XmlWriterDelegator编写器、对象图、DataContractResolver DataContractResolver)
在System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(XmlWriterDelegator编写器、对象图、DataContractResolver DataContractResolver)
at System.Runtime.Serialization.DataContractSerializer.WriteObject(XmlWriter编写器,对象图)
在System.Net.Http.Formatting.XmlMediaTypeFormatter.c__DisplayClass7.b__u6()中
在System.Threading.Tasks.TaskHelpers.RunSynchronously(操作操作,取消令牌)
除了一些序列化错误之外,我还注意到post标题“application/xml”。我不确定这是否相关,但如果有人能提供帮助,我肯定希望得到一些帮助,尝试找到解决方案
谢谢
马克我很确定中的“应用程序/xml”
是相关的
保存后,Breeze Web API控制器会将更新/添加的实体返回给您。您提到的“Accept”头将导致Web API尝试使用XML格式化程序格式化这些实体,而XML格式化程序几乎是alw
// 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"
},
};