0

DataContract() 内で List(Of CustomClass) を返すことに問題はありますか? なんらかの理由で、WCF 接続がランダムに閉じられます。おそらくシリアライゼーションが原因だと思いますが、修正方法がわかりません。List(Of CustomClass) を返そうとしない場合、問題は発生しません。

何が起こっているのかをよりよく理解していただくために、ページに関する情報を WCF サービスに渡そうとしています。検索クローラーのように... ページ タイトル、コンテンツ、リンクなど。List(Of CustomClass) はリンクのリストです。CustomClass は、リンク情報を保持するだけです...アンカー、URL、画像かどうかなど...

私がやろうとしていたのは、ページの情報をカプセル化した 1 つのクラスと、リンク情報を表す List(Of CustomClass) を渡すことです。

何かのようなもの:

<OperationContract()>
Public Function Add_Page(Byval Pages as List(Of PageInfo)) as Integer 

<DataContract()>
Public Class PageInfo
    <DataMember()>
    Public Page_Title as string

    <DataMember()>
    Public Page_Links as List(Of Links)
End Class

<DataContract()>
Public Class Links
    <DataMember()>
    Public Anchor as string

    <DataMember()>
    Public URL as string
End Class

半分の時間は機能しますが、何らかの理由で、残りの半分のサーバー側のトレース情報なしで、一般的な「基になる接続が閉じられました: 接続が予期せず閉じられました。 」というメッセージが表示されます。MaxItemsInGraph を他の設定と一緒に最大化したので、それが原因ではないはずです。時々機能し、他の機能しないのは奇妙です。このエラーを取り除く唯一の方法は、上記の例から List(Of Links) を削除することです。

私はコードを書き直して、List(Of Links) を OperationContract に渡すことで機能するかどうかを確認しています。

<OperationContract()>
Public Function Add_Page(Byval Pages as List(Of PageInfo), Byval Page_Links as List(Of Links)) as Integer 

私は問題なく同様の方法で動作する他のいくつかの機能を持っているので、私はうまくいくと感じています。何か間違ったことをしている、正しくシリアル化していない、または??? これは可能ですか、それとも私の2番目の例は、私が使用する必要があるものですか? ありがとう

編集#1(機能しませんでした)

コメントで提案された DataMember(EmitDefaultValue:=True) は問題を解決しなかったため、クライアント側のコードを記述して、Nulls/Empty 値が送信されていないことを再確認しました (これは、DB に保存する前にサーバー側で行われました)。 .. 問題も解決していないようです。次に、Nulls/Empty 値を確認した後、送信する前にリストから重複を削除していることに気付きました。

重複をチェックするコードを削除したところ、機能しているように見えます... List(Of Links) に一意に入力された後、Remove Dupe コードが新しいリストを割り当てた理由がわかりません。重複を削除したり、新しいリストを古いリストに再割り当てしたりした後、Nulled 値がどのように残っていたのか疑問に思っています。これをもう少しテストします。これ以上問題がない場合は、null 値が転送をジャッキアップしていると仮定するのが正しいと信じているので、あなたの応答を回答としてマークします.. .. . さらにテストした結果、問題は解決しませんでした。物事を絞り込む過程で。報告します。

4

1 に答える 1

0

私もこのエラーを受け取りました。返されるレコードのリストでnull値を返すことと関係があると思います。DataMember属性でこれを[DataMember(EmitDefaultValue = true)]に変更しましたが、クエリでnull値が返されることを望まなかったため、null値のチェックも行いました。返されるデータを見て、null値が含まれている場合は、それらのレコードを送信しないようにチェックして、それが機能するかどうかを確認してください。

編集:私の括弧は、これをc#で行ったため、VBに変換する必要があります。

于 2012-11-12T15:35:24.813 に答える