C# WCF abstraction?

本文关键字:abstraction WCF | 更新日期: 2023-09-27 17:53:07

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

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

如果不使用属性声明IService接口中的每个派生类型,是否可以做到这一点?

C# WCF abstraction?

不,这不可能。所有派生类型都需要在WSDL中公开,从而显式指定。如果您不想修改源代码并重新编译web服务,您可以在web中使用<declaredTypes>元素。配置以实现相同的目标:

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

不直接,但是如果你不介意创建非标准的服务,它可能只能被另一个。net应用程序使用,那么你可以使用这个构造函数来使用KnownTypesAttribute。

这允许你创建一个webservice,它有一个方法,动态地告诉它什么类型可以用于传输。然后,您可以使用反射对加载程序集中派生自您的类型的所有类型进行反射并添加它们。但这必须在服务器和客户端上完成,以便它们相互理解。