use*_*242 4 c# wcf operationcontract
我想在我的Web方法中使用松散类型的参数.
我有一个场景,客户端可以将任何25个DataContract对象发送到WCF操作,例如
proxy1.myFunction(PersonObject)
proxy1.myFunction(ComputerObject)
Run Code Online (Sandbox Code Playgroud)
我的限制是应该只有一个操作合同暴露给客户.
如何设计一个可以将25个DataContract类中的任何一个作为参数的Web方法?我尝试使用objectas类型的参数并赋予KnownTypeDataContract类属性,但在序列化过程中我没有运气.
我刚刚完成了这个,我发现你需要将KnownTypesAttribute添加到接口.
[ServiceContract]
[ServiceKnownType(typeof(MyContract1)]
[ServiceKnownType(typeof(MyContract2)]
[ServiceKnownType(typeof(MyContract3)]
public interface IMyService
{
[OperationContract]
object TakeMessage();
[OperationContract]
void AddMessage(object contract);
}
Run Code Online (Sandbox Code Playgroud)
在您的实现中,您需要检查类型以确保它是您的DataContracts之一.
编辑
如果您有很多合同,可以使用反射将它们添加到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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以声明你的界面,
[ServiceContract]
[ServiceKnownType("GetKnownTypes", typeof(KnownTypeHelper))]
public interface IMyService
{
[OperationContract]
object TakeMessage( );
[OperationContract]
void AddMessage(object contract);
}
Run Code Online (Sandbox Code Playgroud)
这是一种更清洁的方式.