8

我开发(重写到 WCF)一个文件解析 web 服务接受string[]和返回ISection[],但实际上这是一组嵌套接口:

namespace Project.Contracts // Project.Contracts.dll
{
    public interface ISection { }

    public interface ISummarySection : ISection { }

    public interface IDataSection : ISection { }
}

和类:

namespace Project.Format.A // Project.Format.A.dll
{
    [DataContract]
    public class SummarySectionFormatA : ISummarySection { }

    [DataContract]
    public class DataSectionFormatA : IDataSection { }
}

服务接口及其实现:

[ServiceContract]
public interface IService // Project.Contracts.dll
{
    ISection[] Parse(string format, string[] data);
} 

[ServiceKnownType(typeof(SummarySectionFormatA))] // tried this also
[ServiceKnownType(typeof(DataSectionFormatA))]
public class Service : IService // Project.Service.dll
{
    public ISection[] Parse(string format, string[] data)
    {
        return Factory.Create(format).Parse(data);
    }
}

我尝试declaredTypes在服务器和客户端上进行配置:

<system.runtime.serialization>
  <dataContractSerializer>
    <declaredTypes>
      <add type="Project.Contracts.ISumarySection, Project.Contracts">
        <knownType type="Project.Format.A.SummarySectionFormatA, Project.Format.A" />
      </add>
      <add type="Project.Contracts.IDataSection, Project.Contracts">
        <knownType type="Project.Format.A.DataSectionFormatA, Project.Format.A" />
      </add>
    </declaredTypes>
  </dataContractSerializer>
</system.runtime.serialization>

但仍然得到同样的错误:

“不应使用数据合同名称‘DataSection:http://schemas.example.com/Parse’键入‘DataSectionFormatA’。

或者

基础连接已关闭:连接意外关闭。

我无法使用 KnownTypeAttribute 装饰接口,因为 Contracts 项目不引用 Format 项目,并且引用会破坏设计。这就是为什么我想使用配置。

4

3 回答 3

2

看看下面的代码

[ServiceContract]
[ServiceKnownType(typeof(SummarySectionFormatA))]
[ServiceKnownType(typeof(DataSectionFormatA))]
public interface IService {}

public class Service : IService {}
于 2012-06-30T13:18:04.010 回答
1

我相信你应该稍微改变你的实现......看看这个问题,看看它是否有帮助。

于 2012-07-02T07:23:49.910 回答
0

试图使这个工作:

[KnownType("GetKnownType")]
public class Section
{
    static Type[] GetKnownType()
    {
        return new[]
        {
            Type.GetType("Project.Format.A.DataSectionFormatA, Project.Format.A")
        };
    }
}

但似乎服务器和客户端都必须引用Project.Format.A.dll 才能使其工作(方法不返回 null)

于 2012-07-02T07:03:45.413 回答