【发布时间】:2018-02-19 18:57:13
【问题描述】:
我有一个基类 Fallible<T> 和几个派生类 Success<T>、Failure<T> 和 BadIdea<T>,它们将用于 WCF 服务调用的返回值。
正如我previously discovered 一样,为了让它工作,我需要用ServiceKnownType 属性来装饰WCF 服务方法,如下所示...
[OperationContract]
[ServiceKnownType(typeof(Fallible<Patient>)]
[ServiceKnownType(typeof(Success<Patient>)]
[ServiceKnownType(typeof(BadIdea<Patient>)]
[ServiceKnownType(typeof(Failure<Patient>)]
public Fallible<Patient> GetPatient(int id) {
return new Success<Patient>(new Patient {ID = 1,FirstName = "Jim",Surname = "Spriggs"});
}
这很好用。但是,我现在想要一个返回集合的 WCF 服务方法...
public List<Patient> GetDischargedPatients()
按照我之前的做法,我尝试装饰它,但无论我尝试什么组合,我都会遇到异常。这是我尝试过的完整组合...
[OperationContract]
[ServiceKnownType(typeof(Fallible<PatientOverview>))]
[ServiceKnownType(typeof(Success<PatientOverview>))]
[ServiceKnownType(typeof(BadIdea<PatientOverview>))]
[ServiceKnownType(typeof(Failure<PatientOverview>))]
[ServiceKnownType(typeof(Fallible<PatientOverview[]>))]
[ServiceKnownType(typeof(Success<PatientOverview[]>))]
[ServiceKnownType(typeof(BadIdea<PatientOverview[]>))]
[ServiceKnownType(typeof(Failure<PatientOverview[]>))]
[ServiceKnownType(typeof(List<Fallible<PatientOverview>>))]
[ServiceKnownType(typeof(List<Success<PatientOverview>>))]
[ServiceKnownType(typeof(List<BadIdea<PatientOverview>>))]
[ServiceKnownType(typeof(List<Failure<PatientOverview>>))]
public Fallible<List<PatientOverview>> GetDischargedPatients() {
return new Success<List<PatientOverview>>();
}
如你所见,我已经把所有东西都扔进去了(除了实际有效的东西!),但我仍然得到了在发现 ServiceKnownType 属性之前得到的原始异常......
“接收到http://localhost:5448/PatientsService.svc 的HTTP 响应时出错。 这可能是由于服务端点绑定未使用 HTTP 协议。这也可能是 由于服务器中止了 HTTP 请求上下文(可能是由于服务关闭 下)。有关详细信息,请参阅服务器日志。”
内部异常:
“底层连接已关闭:接收时发生意外错误。”
内部异常:
“无法从传输连接中读取数据:现有连接被强行关闭 远程主机。”
内部异常:
“现有连接被远程主机强行关闭”
WCF 确实没有给我任何关于这里出了什么问题的信息。我尝试将ServiceKnownType 与各种返回类型组合一起使用,包括Fallible<Patient[]> 和Fallible<List<Patient>>,但没有帮助。
有人知道我需要做什么才能返回一个集合吗?
【问题讨论】:
-
您返回多少患者?可能是尺码问题!在您的情况下,您如何实现多态性?
-
@Esperadoce 我已经用一个空列表、一名患者等进行了尝试。根据我上次这样做的情况(请参阅链接的问题),问题不在于数据,而在于与序列化器无法序列化数据有关。这是它知道类型的问题,这就是我添加
ServiceKnownType属性的原因。 -
你可以尝试在界面中制作ServiceKnowType吗?
-
我认为你在多态序列化方面有问题我想我有一个链接可以给你,它会告诉你做这件事的路径以及你应该避免什么
-
@Esperadoce 不确定在界面中使用
ServiceKnownType是什么意思。您使用属性标记服务调用本身,就像我在工作示例中所做的那样。这里唯一的区别是我想返回一个集合,而不是单个项目。我有兴趣看到那个链接。谢谢
标签: c# .net wcf serialization datacontractserializer