首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有松散类型参数的WCF OperationContract

具有松散类型参数的WCF OperationContract
EN

Stack Overflow用户
提问于 2012-04-12 14:30:21
回答 2查看 2.9K关注 0票数 4

我希望在我的web方法中有一个松散类型的参数。

我有一个场景,客户端可以将25个DataContract对象中的任何一个发送到WCF操作中。

代码语言:javascript
复制
proxy1.myFunction(PersonObject)
proxy1.myFunction(ComputerObject)

我的限制是应该只有一个操作契约公开给客户端。

我如何设计一个可以接受25个DataContract类中的任何一个作为参数的web方法?我尝试使用object作为参数类型,并为DataContract类提供了KnownType属性,但在序列化过程中没有成功。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-12 14:34:35

我刚刚完成了这项工作,我发现您需要将KnownTypesAttribute添加到接口。

代码语言:javascript
复制
[ServiceContract]
[ServiceKnownType(typeof(MyContract1)]
[ServiceKnownType(typeof(MyContract2)]
[ServiceKnownType(typeof(MyContract3)]
public interface IMyService
{
    [OperationContract]
    object TakeMessage();

    [OperationContract]
    void AddMessage(object contract);

}

在您的实现中,您需要检查类型以确保它是您的DataContracts之一。

编辑

如果您有很多协定,可以使用反射将它们添加到KnownTypes中。

代码语言:javascript
复制
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;
    }
}

然后,您可以将接口声明为,

代码语言:javascript
复制
[ServiceContract]
[ServiceKnownType("GetKnownTypes", typeof(KnownTypeHelper))]
public interface IMyService
{
    [OperationContract]
    object TakeMessage( );

    [OperationContract]
    void AddMessage(object contract);
}

这是一种更干净的方法。

票数 8
EN

Stack Overflow用户

发布于 2012-04-12 14:38:29

您可以尝试的一件事是,创建一个像IObj这样的接口,并为25个不同的数据合约对象实现此接口。然后,对于您的操作合同,设置参数类型为IObj。这将帮助您发送25个参数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10118513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档