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