3

http://kellabyte.com/2010/11/13/building-extensible-wcf-service-interfaces-with-datacontractresolver/のガイドに従って、DataContractSerializer を作成してアタッチしようとしています。

シリアライザーを宣言してメソッドを実装し、次のコードを使用してクライアントとサーバーの両方にアタッチしました。

public class ModuleDataContractResolver : DataContractResolver {
    public override bool TryResolveType(Type type, Type declaredType,
                                            DataContractResolver knownTypeResolver,
                                            out System.Xml.XmlDictionaryString typeName,
                                            out System.Xml.XmlDictionaryString typeNamespace) {
       ....// I return a true/false here
    }

    public override Type ResolveName(string typeName, string typeNamespace,
                                         Type declaredType, DataContractResolver knownTypeResolver) {
       ....// I return a type here
    }

-

        var endpoint = _svcHost.Description.Endpoints.FirstOrDefault()
        ContractDescription cd = endpoint.Contract;
        foreach (OperationDescription opdesc in cd.Operations) {
            DataContractSerializerOperationBehavior serializerBehavior = opdesc.Behaviors.Find<DataContractSerializerOperationBehavior>();

            if (serializerBehavior == null) {
                serializerBehavior = new DataContractSerializerOperationBehavior(opdesc);
                opdesc.Behaviors.Add(serializerBehavior);
            }

            serializerBehavior.DataContractResolver = new ModuleDataContractResolver();
        }

リゾルバーをアタッチしているにもかかわらず、これら 2 つのメソッドはサービスでもクライアントでも呼び出されないため、サービスは例外をスローしています。手順がありませんか?

更新:これが MEF を使用してこれらの型を返すことが原因ではないことを完全に確信しているわけではありません。問題の型は MEF 型であり、サービスによって検出されますが、クライアントへのインターフェイスとしてのみ公開されるため、アセンブリは読み込まれません。

サービスに MEF モジュールのリストをロードさせ、この WCF サービスを介してインターフェイスとしてクライアントに公開するという考え方です。

4

2 に答える 2

1

最終的に、私が試したことのない最後の解決策を見つけたとき、dpblogsによる投稿は、サービスインターフェイスのメソッド宣言で属性を使用する方法を示しました。これにより、最終的に解決メソッドが呼び出されました。

于 2012-07-03T13:35:21.377 に答える
1

サービス側:

foreach (OperationDescription operation in endpoint.Contract.Operations)
    {
        operation.Behaviors.Find<DataContractSerializerOperationBehavior>()
            .DataContractResolver = new ModuleDataContractResolver();
    }

クライアント側:

foreach (var operation in factory.Endpoint.Contract.Operations)
{
    operation.Behaviors.Find<DataContractSerializerOperationBehavior>()
        .DataContractResolver = new ModuleDataContractResolver();
}
于 2012-07-02T11:23:50.453 に答える