次の関係を持つ3つのテーブル(アカウント、連絡先、ユーザー)を持つ単純なデータモデルがあります。
ユーザー->アカウント(1-多数)アカウント->連絡先(多数-1)
OData(v3)WCFデータサービスを介してデータを公開しています。これは、WCFデータサービスクライアントライブラリを使用する.NETクライアントによって使用されます。Add Serviceユーティリティを使用して、データサービスを呼び出すためのクライアントプロキシコードを生成しました。
DataServiceContext
クライアントクラスのすべてのメソッドは、Webサービスを呼び出すためにクラスの単一のオブジェクトを使用します。すなわち:
DC.WhEntities svcClient = new DC.WhEntities(new Uri(BaseUrl));
私が理解しようとして苦労しているのは、サービスへの同じクエリ要求が6回目以降に失敗し始める理由です。私は文字通り、データサービスへの呼び出しを構築するためのすべての可能な方法を試しました。
最初のアプローチ:
DataServiceQuery<DC.User> users = svcClient.Users.Expand("Accounts");
QueryOperationResponse<DC.User> response = users.Execute() as QueryOperationResponse<DC.User>;
var user = response.FirstOrDefault(u => u.Id == long.Parse(key.ToString()));
2番目のアプローチ:
string queryString = string.Format("Users({0}L)?$expand=Accounts", key.ToString());
foreach (var user in response) {...}
上記の両方のソリューションの最後のステートメントは、6 回連続して正常に実行された後、以下のメッセージで失敗し始めます。
The response payload is a not a valid response payload. Please make sure that the top level element is a valid Atom element or belongs to 'http://schemas.microsoft.com/ado/2007/08/dataservices' namespace.
**StackTrace:**
at System.Data.Services.Client.Materialization.ODataMaterializer.CreateODataMessageReader(IODataResponseMessage responseMessage, ResponseInfo responseInfo, Boolean projectionQuery, ODataPayloadKind& payloadKind)
at System.Data.Services.Client.Materialization.ODataMaterializer.CreateMaterializerForMessage(IODataResponseMessage responseMessage, ResponseInfo responseInfo, Type materializerType, QueryComponents queryComponents, ProjectionPlan plan, ODataPayloadKind payloadKind)
at System.Data.Services.Client.DataServiceRequest.Materialize(ResponseInfo responseInfo, QueryComponents queryComponents, ProjectionPlan plan, String contentType, IODataResponseMessage message, ODataPayloadKind expectedPayloadKind)
at System.Data.Services.Client.QueryResult.ProcessResult[TElement](ProjectionPlan plan)
at System.Data.Services.Client.DataServiceRequest.Execute[TElement](DataServiceContext context, QueryComponents queryComponents)
これが発生すると、WCFデータサービスが機能しなくなり、次のような応答が返されます。
1行目の83列目のエラー:エスケープされていない'<'は属性値では許可されていません。
基本的なものが欠けているのか、WCFデータサービスクライアントリクエストを誤って作成しているのか、または同じクライアントが同じものを6回以上リクエストするのを嫌う何かがWCFデータサービス側にあるのかどうかはわかりません。
私はすでに数日を過ごしました、そして私はこれを理解しようとして3日以上を意味しました。私はWCFDataServiceを初めて使用し、このチュートリアルから学ぶことができると思いましたが、これまでのところ、得るよりも苦痛を感じていました。