WCF的配置已知类型从System.Object [英] WCF Known Type from System.Object in Config

查看:165
本文介绍了WCF的配置已知类型从System.Object的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在我的配置指定一个已知类型的,但我有问题,它从Object派生的事实。我可以使它发挥作用,通过指定属性中的已知类型。但在这种情况下,我需要使它从配置工作。

I'm trying to specify a known type in my config, but I'm having problems with the fact that it derives from Object. I can make it work specifying the known type via attribute. But in this case I need to make it work from the config.

下面是一个例子。以下工作正常:

Here's an example. The following works fine:

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

[DataContract]
public class MyData
{
    [DataMember]
    public string Message { get; set; }
}

但是,如果我删除ServiceKnownType属性,把在配置如下:

But if I remove the ServiceKnownType attribute and put the following in the config:

<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>

我得到的消息ConfigurationErrorsException为属性'类型'的值是无效的错误是:该System.Object类型不能用作配置一个声明的类型

I get a ConfigurationErrorsException with the message "The value for the property 'type' is not valid. The error is: The type System.Object cannot be used as a declared type in config."

反正有使通过配置这项工作?

Is there anyway to make this work via config?

推荐答案

答案原来是它不可能做我想做的事情在配置文件中孤独。在配置上面对应于[KnownType]上DataContracts使用的属性。似乎有没有办法实施[ServiceKnownType]在config。

The answer turns out to be it's not possible to do what I want to do in the config file alone. The config above corresponds to the [KnownType] attribute used on DataContracts. There appears to be no way to implement [ServiceKnownType] in the config.

这是另一种方法是使用[ServiceKnownType(方法名,类型)]属性与自定义配置节。新的配置是这样的:

An alternate approach is to use [ServiceKnownType(methodName, type)] attribute with a custom configuration section. The new config looks like this:

<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>

本合同:

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

[DataContract]
public class MyData
{
    [DataMember]
    public string Message { get; set; }
}

这包含返回已知类型​​的列表回调的辅助类

The helper class that contains the callback that returns the list of known types

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;
    }
}

在创建自定义配置部分的信息可以在这里找到:

Information on creating custom config sections can be found here:

<一个href="http://msdn.microsoft.com/en-us/library/2tw134k3.aspx">http://msdn.microsoft.com/en-us/library/2tw134k3.aspx

<一个href="http://msdn.microsoft.com/en-us/library/system.configuration.configurationcollectionattribute.aspx">http://msdn.microsoft.com/en-us/library/system.configuration.configurationcollectionattribute.aspx

这篇关于WCF的配置已知类型从System.Object的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆