5

ASP.NET MVC 4 Web APIプロジェクトを作成し、NuGetを介してクライアントサンプルを含むBreezeをインストールしましたが、ToDoアプリケーションは非常にうまく機能します。また、AndroidタブレットでCordovaを介してアプリを実行し、WebAPIを呼び出しています。これは、エンティティを保存する場合を除いて、うまく機能します。クロスドメイン操作をサポートするために、Global.asax( "Access-Control-Allow-Origin"、 "*")に適切な変更を加えました。

AndroidクライアントがsaveChanges()を呼び出すと、データは実際にデータベースに保存されますが、失敗の約束は常にクライアントで発生します。

Web APIサーバーで、ブラウザーを介してBreeze呼び出しを行うと、次の出力トレースと正常な保存が得られることに気付きました。

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)

いくつかのシリアル化エラーとは別に、投稿ヘッダー「application/xml」にも気づきました。これが適切かどうかはわかりませんが、誰かが助けてくれるなら、解決策を見つけるために助けを求めています。

ありがとうマーク

4

1 に答える 1

4

私はかなり関連があると確信し"application/xml" ています。

保存後、BreezeWebAPIコントローラーは更新/追加されたエンティティを返します。言及した「Accept」ヘッダーにより、Web APIはXMLフォーマッターを使用してこれらのエンティティをフォーマットしようとしますが、ほとんどの場合失敗します。

BreezeがPOSTにAcceptヘッダーをネイティブに設定しているとは思いません(GETにもAcceptヘッダーが設定されているかどうかはわかりません)。

IE10でjQueryAJAXによって生成されたリクエストを見ると、GETのAcceptヘッダーがであることがわかります"application/json, text/javascript, */*; q=0.01"。POSTの場合、AcceptヘッダーとContent-typeヘッダーはそれぞれ"*\*""application/json"です。

AndroidトラフィックのAcceptヘッダーは何ですか?どのヘッダーが設定されているかを指定していません"application/xml"...しかし、それは常に「間違っている」ので、それが重要だとは思いません:)

ここで説明するように、Breeze AJAXアダプターをカスタマイズすることも、完全に置き換えることもできます。あなたは試すかもしれません:

//現在のデフォルトのBreezeajaxアダプターを取得します
 var ajaxAdapter = breeze.core.config.getAdapterInstance( "ajax");
 //固定ヘッダーを設定します
 ajaxAdapter.defaultSettings = {
       ヘッダー:{
           "承認": "application / json、text / javascript、* / *; q = 0.01"
       }、
};

IE10とChromeの両方での私のテストでは、これでうまくいくようでした。

また、Breeze Web API JsonFormatterAttributeでXMLフォーマッターを削除して、Breezeトラフィックでは機能しないことがわかっていることを確認することをお勧めします。

これがうまくいくことを願っています。

于 2012-12-02T17:20:33.370 に答える