質問

私はこれをしばらくの間これを回ってきましたが、既知のタイプに参照を追加するために構成を使用できる理由、またはそれをデバッグする方法を理解できません。ポインターは私の正気を救うかもしれません。

WindowsサービスでホストされているWCFサービスがあり、サービス用の構成ファイルがあります。構成で私はこれを持っています:

<configuration>
...
  <system.runtime.serialization>
    <dataContractSerializer>
      <declaredTypes>
        <add type="My.Full.Interface.Name, My.Assembly.Name.With.No.dll">
          <knownType type="My.Full.Implementation.Class.Name, My.Assembly.Name.With.No.dll"/>              
        </add>
      </declaredTypes>
    </dataContractSerializer>
  </system.runtime.serialization>
...
</configuration>

追加してみました Version=1.0.0.0,Culture=neutral,PublicKeyToken=null 両方の宣言に対して、しかし、私はデータ契約のシリアルを選択させることができないようです。

私はこのクラスを返すことができることを確認しました( [ServiceKnownType(typeof(My.Implementation.Class))])そしてそれは機能しますが、それを使用したい別の実装があります。それをアノセットアセンブリにあるため、それを追加した場合に円形の参照を作成するので、それを使用できません。

DataContract Serializerが私のタイプを見つけられない理由をデバッグするにはどうすればよいですか?または私の宣言の何が問題になっていますか?

役に立ちましたか?

解決 2

ですから、私の問題は、私のベースタイプはインターフェスであり、既知のタイプの属性がクラスにのみ適用できるように、これが機能していなかったということでした。

の提案を使用することで、それを回避することができました この答え

 [ServiceKnownType ("GetKnownTypes", typeof (KnownTypesProvider))] 

サービスの整数で、その後、タイプを提供するクラスと方法を提供します。

internal static class KnownTypesProvider
    {
    public static IEnumerable<Type> GetKnownTypes (ICustomAttributeProvider provider)
        {            
        return new[] {Type.GetType ("Assembly qualified type name")};
        }
    } 

また、異なるアセンブリにあるタイプの解決も可能になりました。これは機能しますが、それは素晴らしいことではないので、おそらくこれのような構成を使用するソリューションに行くことになります 答え, 、またはSOEM属性を私のクラスに追加し、それを使用して既知のタイプを識別します。

他のヒント

Windowsサービスをデバッグする方法を探している場合は、ラインを追加してみてください System.Diagnostics.Debugger.Break(); サービススタートアップで。これが、シリアル化インフラストラクチャがDataContractSerializerを選択していない理由を見つけるのに十分に早いかどうかはわかりません。

にエラーが表示されません <system.runtime.serialization> 投稿した要素。 exe.configファイルの残りの部分をセマンティックエラーについて調査しましたか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top