我开发(重写到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项目,并且引用会破坏设计。这就是我想使用config的原因。
答案 0 :(得分:2)
看看下面的代码
[ServiceContract]
[ServiceKnownType(typeof(SummarySectionFormatA))]
[ServiceKnownType(typeof(DataSectionFormatA))]
public interface IService {}
public class Service : IService {}
答案 1 :(得分:1)
我相信你应该稍微改变你的实现......看看这个question并看看它是否有帮助。
答案 2 :(得分: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)