4

Webメソッドに緩く型付けされたパラメーターが必要です。

クライアントが25個のDataContractオブジェクトのいずれかをWCF操作に送信できるシナリオがあります。

proxy1.myFunction(PersonObject)
proxy1.myFunction(ComputerObject)

私の制限は、クライアントに公開される操作契約は1つだけであるべきだということです。

25個のDataContractクラスのいずれかをパラメーターとして受け取ることができるWebメソッドを設計するにはどうすればよいですか?objectパラメータのタイプとして試してKnownType、DataContractクラスに属性を与えましたが、シリアル化プロセス中に運がありませんでした。

4

2 に答える 2

8

これを行ったところ、KnownTypesAttribute をインターフェイスに追加する必要があることがわかりました。

[ServiceContract]
[ServiceKnownType(typeof(MyContract1)]
[ServiceKnownType(typeof(MyContract2)]
[ServiceKnownType(typeof(MyContract3)]
public interface IMyService
{
    [OperationContract]
    object TakeMessage();

    [OperationContract]
    void AddMessage(object contract);

}

実装では、タイプをチェックして、それが DataContracts の 1 つであることを確認する必要があります。

編集

コントラクトが多数ある場合は、リフレクションを使用してそれらを KnownTypes に追加できます。

internal static class KnownTypeHelper
{
    public static IEnumerable<Type> GetKnownTypes(ICustomAttributeProvider provider = null)
    {
        var types = Assembly.GetExecutingAssembly().GetTypes().Where(a => a.Namespace == "Company.Path.To.DataContractsNamespace").ToArray();

        return types;
    }
}

次に、インターフェイスを次のように宣言できます。

[ServiceContract]
[ServiceKnownType("GetKnownTypes", typeof(KnownTypeHelper))]
public interface IMyService
{
    [OperationContract]
    object TakeMessage( );

    [OperationContract]
    void AddMessage(object contract);
}

これは、はるかにクリーンな方法です。

于 2012-04-12T06:34:35.427 に答える