4

次の関係を持つ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を初めて使用し、このチュートリアルから学ぶことができると思いましたが、これまでのところ、得るよりも苦痛を感じていました。

4

2 に答える 2

3

同様の問題が発生しています。突然サーバーが起動し(更新によってこれが発生した可能性がありますが、原因は不明です)、不正な応答が返されます。サーバーを起動すると、しばらくの間機能します。たとえば、通常の方法でいくつかのリクエストに応答してから、ODataフィードのxml構造を壊し始めた<場合、16進値0x3Cは無効な属性文字になります。Line 2, position 72. exception

解決:

このフィードに従って問題を解決しました

WCFトレースを構成している場合logMessagesAtTransportLevel="false"は、オフになっていることを確認してください。オフになっていないと、この問題が発生します。

于 2012-09-28T05:55:33.243 に答える
0

logMessagesAtTransportLevelをfalseに設定しようとしましたが、それでもエラーが発生しました。

それから、私がアセンブリの競合を起こした前に、この問題を見たことを思い出しました。私は行って新しいサービスを作成しました。これにより、クライアントでlogMessagesAtTransportLevelがtrueに設定されている場合でも問題が解決しました。これにより、問題はサービスにあることがわかりました。

私の解決策は私の問題を解決しましたが、私はまだ正確な問題を知りません、そして私はすでにそれを見つけるために時間を使い果たしました。しかし、人々が喜んで手伝ってくれるのを見るのは良いことであり、私はその努力に心から感謝しています。

皆様のご協力に改めて感謝いたします。

Qster123。

于 2012-09-29T19:59:06.360 に答える