2

このエラーは、NetDataContractSerializer (NetDCS) が使用されているが、参照アセンブリが共有されておらず、クライアントに含まれているために発生します。この質問はそれについてではありません。

この質問は、NetDataContractSerializerが使用されないようにすることに関するものです。または、少なくともそれがクライアントによって使用されている理由を見つけます。

  • クライアントが NetDCS を使用するように構成していないのに、なぜNetDCS を使用するのですか?

    私が見つけた記事/投稿によると、これは明示的なステップです。プロジェクトまたは WCF クライアントに対してこれを手動で有効にしていません。

  • クライアントに通常のDataContractSerializer (DCS) を使用させることはできますか?

    もしそうなら、これを型ごとまたは名前空間ごとに強制することはできますか? ジェネリック フレームワークの "基本型" は、参照されているアセンブリに既に含まれています。理想的には、これらを NetDCS で解決し続けることができますが、この問題を「修正」するために NetDCS をあきらめます。

    そうでない場合、応答/応答 XML を変更するなど、利用可能な抜本的な対策はありますか?

    (必要なコントラクト リゾルバーを手動で追加し、生成された名前の破損を処理しても問題ありません。)

WCF テスト クライアント (常に DCS を使用しますか?) を使用すると「正常に動作します」。現在の問題は、プロジェクトのサービスを使用するときに発生する NetDCS デシリアライゼーションに関連していると思われます。WCF テスト クライアントのしくみを誤解している可能性があります。

問題を誤解していないことを確認するためのエラー メッセージ (NetDCS の参照アセンブリを追加することで解決できますが、私はそうしたくありません) を次に示します。これはclientでの逆シリアル化にあると 95% 確信しています。

メッセージを逆シリアル化しようとしているときに、フォーマッタが例外をスローしました..

「タイプ '..' を取得専用コレクションとして使用することは、NetDataContractSerializerではサポートされていません。CollectionDataContractAttribute 属性または SerializableAttribute 属性で型をマークするか、プロパティにセッターを追加することを検討してください。

そしてスタックの要約:

Server stack trace: 
   at System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(Message reply, MessageFault fault, String action, MessageVersion version, FaultConverter faultConverter)
   at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ref ProxyRpc rpc)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService

WCF クライアント構成は "単純な" 既定の構成であり、実行時に動作を変更するコードはありません。

<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_myServiceBinding" />
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="endPoint.svc"
          binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_myServiceBinding"
          contract="MyServive.IMyServiceEndPoint" name="BasicHttpBinding_serviceEndPoint" />
    </client>
  </system.serviceModel>

サービス参照は VS 2013 で生成され、プロジェクトは .NET 4 をターゲットにしています。サービス参照を含むプロジェクトとテスト プロジェクトはどちらも単純なクラス ライブラリです。これらは IIS でホストされていません。

4

1 に答える 1

0

XmlSerializerFormatAttribute ( http://msdn.microsoft.com/en-us/library/system.servicemodel.xmlserializerformatattribute.aspx ) を適用して、クラスに XML シリアライザーを強制的に使用させることができます。

于 2015-01-08T17:33:38.543 に答える