web-dev-qa-db-ja.com

WCFの複雑なデータ型?

孫オブジェクトのコレクションを再び保持できる子オブジェクトのコレクションを保持するオブジェクトを返そうとすると、問題が発生しました。 「ホストによって接続が強制的に閉じられました」というエラーが表示されます。

これを機能させる方法はありますか?私は現在これに似た構造を持っています:

擬似コード:

Person:
IEnumerable<Order>

Order:
IEnumerable<OrderLine>

3つのオブジェクトすべてにDataContract属性があり、公開したいすべてのパブリックプロパティ(IEnumerableを含む)にはDataMember属性があります。

サービスに複数のOperationContractがあり、単一のオブジェクトを返すすべてのメソッドORオブジェクトのIEnumerableは完全に機能します。IEnumerableをネストしようとした場合にのみ、問題が発生します。クライアントでもサービスリファレンスコレクションタイプとして汎用リストを選択しました。強調したいのですが、このエラーで失敗するのは1つの操作/メソッドのみです。残りは完全に機能します

編集(より詳細なエラーの説明):

[SocketException (0x2746): An existing connection was forcibly closed by
the remote Host]
[IOException: Unable to read data from the transport connection:
An existing connection was forcibly closed by the remote Host.]
[WebException: The underlying connection was closed: An unexpected
error occurred on a receive.]
[CommunicationException: An error occurred while receiving the HTTP
response to http://myservice.mydomain.dk/MyService.svc. This could
be due to the service endpoint binding not using the HTTP protocol.
This could also be due to an HTTP request context being aborted by
the server (possibly due to the service shutting down). See server
logs for more details.]

ログを探してみましたが、見つかりません...また、WSHttpBindingとhttpエンドポイントを使用しています。

注意として、WCFロギングユーティリティの使用方法を学ぶ必要があります。

ロギング情報

構成エディター (セットアップが簡単になります)。

トレースビューア。 完全に素晴らしい。複数のサービス(クライアントとサーバー)がトレースしてそれらに参加し、すべての詳細を分析できるようにします。問題の根本にすばやく到達できます。 (サーバーのWCFエラーが発生すると、クライアントが有用なデータを取得する可能性が低くなります。)

38
MichaelGG

さて、私はついに私の場合の本当の問題を見つけました。列挙型を公開することは、世界で最も素晴らしいことではないようです。それらにデフォルト値を設定するか、代わりにプロパティをintまたは列挙型の基になっている整数型として公開する必要があります。

助けてくれてありがとう、あなたはこれを知る方法がありませんでした-私は私の構造の3番目のレベルで列挙型を見つけました、そして体系的にデータメンバーを一つずつ削除することは私が見つけた方法でした。この問題に遭遇したのは私だけではないようです-この男は明らかに同様の問題を抱えていました:)

http://zianet.dk/blog/2007/11/24/serializing-enums-in-wcf/

WCF +(EF + POCO)を使用している場合は、設定してみてください。

ObjectContext.ContextOptions.LazyLoadingEnabled = false;
ObjectContext.ContextOptions.ProxyCreationEnabled = false;
10
paragy

列挙型は、他のクラスと同様にDataContract属性を取得しますが、列挙型の値にはDataMember属性が含まれているとは限りません。

それらをEnumMemberに変更すると、この不可解なエラーが発生しなくなります。

3

この行を<system.web/>に追加します。

<httpRuntime maxRequestLength="102400" executionTimeout="3600" />
3

これは実際には、最初の例外の説明と同じ情報です。それは、socketexceptionの元の原因が何であったかを興味深いものにするでしょう。それはサービス自体のある種のエラーでなければなりません。正確に埠頭の例外が発生する場所を見つけることができますか?

nHibernateによって上書きされ(仮想としてマークされた)、シリアル化できないGenericPersistentBagに置き換えられた通常のIEnumerableを返そうとしたときに、同様のエラーが発生しました。 nhibernateまたは同様の理由で、IEnumerableデータメンバーを仮想としてマークしましたか?これはあなたのエラーを説明するかもしれません。

ところで。 wcfの例外は、多くの場合、まったく意味がありません(バグを追跡するときに、非常にイライラする可能性があります;)

私も同じ問題を抱えています(.Net3.5)。私の基本クラスDataContractに既知の型がありませんでした。 WCFエラーがより説明的ではなかったのは残念です。

1
Kyle Lahnakoski

インターフェイスメソッドの実装の上に[OperationBehavior()]を設定してみてください。

0
trkll

'yield return'を使用して、DataContract型にマップされたオブジェクトの列挙を構築すると、このエラーが発生しました。

歩留まりの結果でToList/ToArrayを呼び出すと問題が修正され、サービス呼び出しは正しく機能しました。

0
Rob Willis

なぜこれが起こり得るのか分かりません。しかし、私も同様の問題を抱えていました。

列挙型を変更しました。インデックスを削除します(例:ASNOrder = 1、-> ASNOrder、)。エラーは発生しません。

0
Greg Ho

サービス動作設定で指定しましたか?このスタックトレースにいくつかの情報が欠落しているようです。

サーバー側で例外を取得できますか(たとえば、Visual Studioデバッグモードまたはlog4netなどのログライブラリを使用)。

同じサービスで他のメソッド(単純なhelloworld()など)を呼び出して、サービス構成自体が機能することを確認しましたか?この種の例外は、シリアル化の問題を示している可能性もあります。どのタイプをネットワーク経由で送信しますか?どこかでKnownTypeを使用していますか?

Server Error in '/' Application.
--------------------------------------------------------------------------------

An existing connection was forcibly closed by the remote Host 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote Host

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the Origin and location of the exception can be identified using the exception stack trace below.  

Stack Trace: 


[SocketException (0x2746): An existing connection was forcibly closed by the remote Host]
   System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags) +93
   System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) +119

[IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote Host.]
   System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) +267
   System.Net.PooledStream.Read(Byte[] buffer, Int32 offset, Int32 size) +25
   System.Net.Connection.SyncRead(HttpWebRequest request, Boolean userRetrievedStream, Boolean probeRead) +306

[WebException: The underlying connection was closed: An unexpected error occurred on a receive.]
   System.Net.HttpWebRequest.GetResponse() +1532114
   System.ServiceModel.Channels.HttpChannelRequest.WaitForReply(TimeSpan timeout) +40

[CommunicationException: An error occurred while receiving the HTTP response to http://Zzzstrukturservice.xxx.dk/ZzzstrukturService.svc. This could be due to the service endpoint binding not using the HTTP protocol. This could also be due to an HTTP request context being aborted by the server (possibly due to the service shutting down). See server logs for more details.]
   System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(iMessage reqMsg, iMessage retMsg) +2668969
   System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) +717
   xxx.Services.ZzzstrukturServiceClient.ZzzstrukturServiceProxy.IZzzstrukturService.GetMatrixSet(Int32 matrixSetId) +0
   xxx.Services.ZzzstrukturServiceClient.ZzzstrukturRepository.GetMatrixSetById(Int32 matrixSetId) in f:\ccnet\work\xxx.Zzzstruktur\1. Presentation Layer\ZzzstrukturServiceClient\ZzzstrukturRepository.cs:90
   xxx.yyy.yyyWeb.AnnoncePage.OnLoad(EventArgs e) in f:\ccnet\work\yyyV2\1. Presentation Layer\yyyWeb\Annonce.aspx.cs:40
   System.Web.UI.Control.LoadRecursive() +47
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1436




--------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version:2.0.50727.1433; ASP.NET Version:2.0.50727.1433 

コントラクトでリテラルIEnumerableを返さないでください。有名な WCF IEnumerableバグ があります。

0
Chris O

はい、ここでも同じ問題が発生しました。列挙値を含むオブジェクトを返すことでした。 DataMemberをintに変更し、すべてが機能していると述べました。

0
Tiny122