C#WCF抽象?

时间:2011-04-27 14:48:16

标签: c#

是否可以声明基本已知类型并允许传输所有派生类型?

[ServiceContract]
public interface IService
{
    [OperationContract]
    [ServiceKnownType(typeof(BaseMsg))]
    object[] Do(BaseMsg msg);
}

这可以在不使用属性声明IService接口中的每个派生类型的情况下完成吗?

2 个答案:

答案 0 :(得分:3)

不,这是不可能的。所有派生类型都需要在WSDL中公开,因此明确指定。如果您不想修改源代码并重新编译Web服务,可以使用web.config中的<declaredTypes>元素来实现相同的目标:

<system.runtime.serialization>
    <dataContractSerializer>
        <declaredTypes>
            <add type="AppName.BaseType, AppName">
                <knownType type="AppName.KnownType, AppName" />
            </add>
        </declaredTypes>
    </dataContractSerializer>
</system.runtime.serialization>

答案 1 :(得分:1)

不直接,但如果您不介意创建非标准服务,那可能只能被其他.NET应用程序使用,那么您可以使用KnownTypesAttribute使用this constructor

这允许您创建一个具有方法的web服务,动态地告诉它可用于传输的类型。然后,您可以使用反射来反映加载的程序集中的所有类型,这些类型派生自您的类型并添加它们。但这必须在服务器和客户端上完成,以便彼此了解。