1

プロジェクトを Visual Studio 2012 に更新し、4.0 から .NET Framework 4.5 をターゲットにして以来、サービス メソッドからデータを返そうとすると断続的にシリアル化例外の問題が発生しましたが、問題をデバッグする目的で、 GetPageSelectListForSite という 1 つのサービス メソッドに注目します。

このメソッド インターフェイス宣言は次のとおりです。

[OperationContract]
[WebInvoke(Method = "GET",
ResponseFormat = WebMessageFormat.Json,
RequestFormat = WebMessageFormat.Json,
UriTemplate = "/Pages/Site/ListItems/{siteId}",
BodyStyle = WebMessageBodyStyle.Bare),
Description("")]
IEnumerable<PageInfoItem> GetPreviousPages(string siteId);

これは同じ署名パラメーターで呼び出され、同じ IEnumerable データがコントローラー内で返されます。ただし、時折 (100 回程度に 1 回)、コントローラーが REST サービスの応答を逆シリアル化しようとすると、シリアル化例外が発生します。

System.Runtime.Serialization.SerializationException: System.Collections.Generic.IEnumerable`1[[Synodine.Hkd.Models.PageInfoItem, Synodine.Hkd.Models, Version=1.0.0.0, Culture= 型のオブジェクトの逆シリアル化中にエラーが発生しましたニュートラル、PublicKeyToken=null]]。予期しない文字 'D' に遭遇しました。---> System.Xml.XmlException: 予期しない文字 'D' が見つかりました。

完全な例外と対応するスタック トレースは、http: //pastebin.com/jaqQDbruで入手できます。

PageInfoItem は文字列を含む非常に単純なクラスであり、GUID、いくつかの文字列、いくつかのブール値、および DateTime を含む ListInfoBase から派生します。

[Serializable] AND/OR [DataContract]/[DataMember] でクラスを装飾しようとしても、何の効果もありませんでした。問題を一貫して再現することはできませんでした。

非常に単純な REST GET メソッドでシリアライゼーション例外エラーが発生し、応答/要求形式が Json に設定され、単一の文字列を返す Bare の BodyStyle が設定されていることに注意してください。問題の残りのサービス メソッドが POST/GET であるかどうか、またはそのスタイルが Bare または Wrapped に設定されているかどうかは問題ではないようですが、すべての場合で WebMessageFormat.Json を使用しています。

データを自分でシリアル化し、ログに記録して、JSON が何らかの方法で不正な形式であるかどうかを確認しようとしましたが、JSON は有効であり、失敗した/成功した要求全体で同一です。

これは、データをシリアル化するために使用したコードです。

var stream1 = new MemoryStream();
var ser = new DataContractJsonSerializer(typeof(IEnumerable<PageInfoItem>));
ser.WriteObject(stream1, PageInfoItems);

stream1.Position = 0;
var streamReader = new StreamReader(stream1);

ログに記録される JSON のサンプルは次のとおりです。

[
  {
    "DateLastUpdate": "\/Date(1362438368000+0000)\/",
    "DateLastUpdateString": null,
    "Id": "df2544e6-71a3-4f1c-ac54-d3c85269804f",
    "IsSelected": false,
    "Name": "samplepage",
    "Path": "\/samplepage"
  },
  <snip>
]

この問題は、デプロイされた環境でのみ発生します。ローカルの IIS Web サーバーで問題を再現しようとする試みはすべて失敗しました。

WebChannelFactory を使用して、WCF REST サービスを使用しています。このため、Response に直接アクセスすることはできません (また、取得方法も不明です)。そのため、ネットワーク経由で送信されるデータの 100% を取得することはできません。

プロジェクトを Visual Studio 2012/.NET 4.5 Framework にアップグレードするときに、これに似た問題に遭遇した人はいますか?

どんな反応も間違いなく感謝します -- ショーン

4

1 に答える 1

0

Can you try exposing another function which return same data that GetPreviousPage returns, but changing the ResponseFormat to say Xml? Then call it multiple times (e.g. from a browser) and see if this new function ever fails. This well help you know if the problem is with Json Serializer.

[OperationContract]
[WebInvoke(Method = "GET",
ResponseFormat = WebMessageFormat.Xml,
RequestFormat = WebMessageFormat.Json,
UriTemplate = "/Pages/Site/ListItemsNew/{siteId}",
BodyStyle = WebMessageBodyStyle.Bare),
Description("")]
IEnumerable<PageInfoItem> GetPreviousPagesNew(string siteId);

PS: Posted this as an answer as it's difficult to post code in comment.

于 2013-03-07T20:22:14.600 に答える