Config中System.Object的WCF已知类型

Sco*_*t J 8 .net c# wcf wcf-configuration known-types

我正在尝试在配置中指定一个已知类型,但我遇到的问题是它派生自Object.我可以通过属性指定已知类型.但在这种情况下,我需要从配置中使其工作.

这是一个例子.以下工作正常:

[ServiceContract]
[ServiceKnownType(typeof(MyData))]
public interface IContract
{
    [OperationContract]
    void Send(object data);
}

[DataContract]
public class MyData
{
    [DataMember]
    public string Message { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我删除ServiceKnownType属性并将以下内容放入配置中:

<system.runtime.serialization>
  <dataContractSerializer>
    <declaredTypes>
      <add type="System.Object, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
        <knownType type="WpfApplication1.MyData, WpfApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
      </add>
    </declaredTypes>
  </dataContractSerializer>
</system.runtime.serialization>
Run Code Online (Sandbox Code Playgroud)

我得到一个ConfigurationErrorsException,消息"属性'类型'的值无效.错误是:类型System.Object不能用作config中的声明类型."

无论如何通过配置使这项工作?

Sco*_*t J 9

答案结果证明是不可能单独在配置文件中做我想做的事情.上面的配置对应于DataContracts上使用的[KnownType]属性.似乎无法在配置中实现[ServiceKnownType].

另一种方法是将[ServiceKnownType(methodName,type)]属性与自定义配置节一起使用.新配置如下所示:

<configuration>
  <configSections>
    <section
      name="serviceKnownTypes"
      type="WpfApplication1.ServiceKnownTypesSection, WpfApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
  </configSections>
  <serviceKnownTypes>
    <declaredServices>
      <serviceContract type="WpfApplication1.IContract, WpfApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
        <knownTypes>
          <knownType type="WpfApplication1.MyData, WpfApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
        </knownTypes>
      </serviceContract>
    </declaredServices>
  </serviceKnownTypes>
</configuration>
Run Code Online (Sandbox Code Playgroud)

合同:

[ServiceContract]
[ServiceKnownType("GetServiceKnownTypes", typeof(KnownTypeHelper))]
public interface IContract
{
    [OperationContract]
    void Send(object data);
}

[DataContract]
public class MyData
{
    [DataMember]
    public string Message { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

包含返回已知类型列表的回调的帮助程序类

public static class KnownTypeHelper
{
    public static IEnumerable<Type> GetServiceKnownTypes(ICustomAttributeProvider provider)
    {
        List<Type> result = new List<Type>();

        ServiceKnownTypesSection serviceKnownTypes = (ServiceKnownTypesSection)ConfigurationManager.GetSection("serviceKnownTypes");
        DeclaredServiceElement service = serviceKnownTypes.Services[((Type)(provider)).AssemblyQualifiedName];

        foreach (ServiceKnownTypeElement knownType in service.KnownTypes)
        {
            result.Add(knownType.Type);
        }

        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

有关创建自定义配置部分的信息,请访问:

http://msdn.microsoft.com/en-us/library/2tw134k3.aspx

http://msdn.microsoft.com/en-us/library/system.configuration.configurationcollectionattribute.aspx