wcf服务已知类型属性问题

wcf服务已知类型属性问题,wcf,Wcf,我想添加一个服务行为(或任何你建议的),它会自动将dll中的类型插入到服务的已知类型中 可能吗?怎么做 将已知类型属性传递给DataContractSerializer构造函数。通过对程序集进行反射并查找派生自基类的所有类型,可以将已知类型和提供给序列化程序的 下面是一个示例代码(未测试): [服务合同] 公共接口合同 { [经营合同] [KnownTypesDataContractFormat(typeof(SomeBaseType))] 无效MyOperation(SomeBaseType

我想添加一个服务行为(或任何你建议的),它会自动将dll中的类型插入到服务的已知类型中


可能吗?怎么做

将已知类型属性传递给DataContractSerializer构造函数。通过对程序集进行反射并查找派生自基类的所有类型,可以将已知类型和提供给序列化程序的

下面是一个示例代码(未测试):

[服务合同]
公共接口合同
{
[经营合同]
[KnownTypesDataContractFormat(typeof(SomeBaseType))]
无效MyOperation(SomeBaseType arg);
}
公共类KnownTypesDataContractFormatAttribute:属性,IOperationBehavior
{
公共类型基类型{get;private set;}
public KnownTypesDataContractFormatAttribute(类型baseType)
{
BaseType=BaseType;
}
public void AddBindingParameters(操作说明、BindingParameterCollection参数)
{ }
public void ApplyClientBehavior(操作描述,System.ServiceModel.Dispatcher.ClientOperation代理)
{
IOperationBehavior innerBehavior=新的KnownTypesDataContractSerializerOperationBehavior(描述,基本类型);
ApplyClientBehavior(描述,代理);
}
public void ApplyDispatchBehavior(操作描述,System.ServiceModel.Dispatcher.DispatchOperation dispatch)
{
IOperationBehavior innerBehavior=新的KnownTypesDataContractSerializerOperationBehavior(描述,基本类型);
ApplyDispatchBehavior(描述、分派);
}
公共无效验证(操作说明)
{ }
}
公共类KnownTypesDataContractSerializeRopection行为:DataContractSerializeRopection行为
{
公共类型基类型{get;private set;}
public KnownTypesDataContractSerializerOperationBehavior(OperationDescription OperationDescription,类型baseType):基本(OperationDescription)
{
BaseType=BaseType;
}
公共重写XmlObjectSerializer CreateSerializer(类型类型、字符串名称、字符串ns、IList knownTypes)
{
返回新的DataContractSerializer(类型、名称、ns、knownTypes);
}
公共重写XmlObjectSerializer CreateSerializer(类型类型、XmlDictionaryString名称、XmlDictionaryString ns、IList knownTypes)
{
返回新的DataContractSerializer(类型、名称、ns、knownTypes);
}
私有IEnumerable GetKnownTypes()
{
//尝试在中查找从BaseType派生的所有类型
//执行汇编并将其添加到knownTypes集合
返回
从Assembly.getExecutionGassembly().GetTypes()中输入
其中type!=BaseType&&BaseType.IsAssignableFrom(type)
选择类型;
}
}

很抱歉,我对wcf很感兴趣,如何使整个服务成为一个非每个方法?通过实现IServiceBehavior()而不是IOperationBehavior
[ServiceContract]
public interface FooContract
{
    [OperationContract]
    [KnownTypesDataContractFormat(typeof(SomeBaseType))]
    void MyOperation(SomeBaseType arg);
}

public class KnownTypesDataContractFormatAttribute : Attribute, IOperationBehavior
{
    public Type BaseType { get; private set; }
    public KnownTypesDataContractFormatAttribute(Type baseType)
    {
        BaseType = baseType;
    }

    public void AddBindingParameters(OperationDescription description, BindingParameterCollection parameters)
    { }

    public void ApplyClientBehavior(OperationDescription description, System.ServiceModel.Dispatcher.ClientOperation proxy)
    {
        IOperationBehavior innerBehavior = new KnownTypesDataContractSerializerOperationBehavior(description, BaseType);
        innerBehavior.ApplyClientBehavior(description, proxy);
    }


    public void ApplyDispatchBehavior(OperationDescription description, System.ServiceModel.Dispatcher.DispatchOperation dispatch)
    {
        IOperationBehavior innerBehavior = new KnownTypesDataContractSerializerOperationBehavior(description, BaseType);
        innerBehavior.ApplyDispatchBehavior(description, dispatch);
    }

    public void Validate(OperationDescription description)
    { }
}

public class KnownTypesDataContractSerializerOperationBehavior : DataContractSerializerOperationBehavior
{
    public Type BaseType { get; private set; }
    public KnownTypesDataContractSerializerOperationBehavior(OperationDescription operationDescription, Type baseType) : base(operationDescription) 
    {
        BaseType = baseType;
    }

    public override XmlObjectSerializer CreateSerializer(Type type, string name, string ns, IList<Type> knownTypes)
    {
        return new DataContractSerializer(type, name, ns, knownTypes);
    }

    public override XmlObjectSerializer CreateSerializer(Type type, XmlDictionaryString name, XmlDictionaryString ns, IList<Type> knownTypes)
    {
        return new DataContractSerializer(type, name, ns, knownTypes);
    }

    private IEnumerable<Type> GetKnownTypes()
    {
        // Try to find all types that derive from BaseType in the 
        // executing assembly and add them to the knownTypes collection
        return 
            from type in Assembly.GetExecutingAssembly().GetTypes()
            where type != BaseType && BaseType.IsAssignableFrom(type)
            select type;
    }
}