我有一个基类Fallible<T>
和几个派生类Success<T>
,Failure<T>
和BadIdea<T>
,它们将用于WCF服务调用的返回值。< / p>
正如我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
属性之前得到的原始异常......
&#34;接收到http://localhost:5448/PatientsService.svc的HTTP响应时发生错误。 这可能是由于服务端点绑定不使用HTTP协议。这也可能是 由于HTTP请求上下文被服务器中止(可能是由于服务关闭) 下)。有关详细信息,请参阅服务器日志。&#34;
内部异常:
&#34;底层连接已关闭:接收时发生意外错误。&#34;
内部异常:
&#34;无法从传输连接读取数据:强制关闭现有连接 远程主机。&#34;
内部异常:
&#34;远程主机&#34;
强行关闭现有连接
WCF真的没有给我任何关于这里出了什么问题的信息。我尝试将ServiceKnownType
与返回类型的各种组合一起使用,包括Fallible<Patient[]>
和Fallible<List<Patient>>
,但它没有帮助。
有什么想法我需要做些什么才能归还收藏品?
答案 0 :(得分:2)
因此,我尝试使用精简版的代码复制您的问题,最后使用此
[ServiceContract]
public interface IService1
{
//Get a patient's data
[OperationContract]
[ServiceKnownType(typeof(Fallible<Patient>))]
[ServiceKnownType(typeof(Success<Patient>))]
Fallible<Patient> GetPatient(int id);
//Get a list of Patients
[OperationContract]
List<Patient> GetPatients();
//Get a list of patients
[OperationContract]
[ServiceKnownType(typeof(Fallible<List<Patient>>))]
[ServiceKnownType(typeof(Success<List<Patient>>))]
Fallible<List<Patient>> GetSpecificPatients(string type);
}
以及服务的实施:
public class Service : IService1
{
public Fallible<Patient> GetPatient(int id)
{
return new Success<Patient>() { Value = new Patient() { Name = "Scott Robinson" } };
}
public List<Patient> GetPatients()
{
List<Patient> patients = new List<Patient>();
patients.Add(new Patient() { Name = "Scott Robinson" });
patients.Add(new Patient() { Name = "Darryl Robinson" });
return patients;
}
public Fallible<List<Patient>> GetSpecificPatients(string type)
{
switch (type)
{
case "Fallible":
return new Fallible<List<Patient>>() { Value = new List<Patient>() { new Patient() { Name = "Scott" }, new Patient() { Name = "Darryl" } } };
default:
return new Success<List<Patient>>() { Value = new List<Patient>() { new Patient() { Name = "Scott" }, new Patient() { Name = "Darryl" } } };
}
}
}
但是我没有得到错误。
查看您的代码,我可以看到您的GetDiscardedPatients
返回Fallible<List<PatientOverview>>
,但“ServiceKnownTypes”都不属于此类型。你试过了吗?
ServiceKnownType[Fallible<List<PatientOverview>>]
ServiceKnownType[Success<List<PatientOverview>>]
...
public Fallible<List<PatientOverview>> GetDischargedPatients() {
return new Success<List<PatientOverview>>();
}
答案 1 :(得分:0)
<script>
$(document).ready(function () {
$('.test').click(function () {
var replaced = $('.original').html();
$('.replace').html(replaced);
});
});
</script>
这是每次WCF需要知道类型时都会调用的辅助类。
[ServiceContract]
[ServiceKnownType("GetKnownTypes", typeof(CommandServiceHelper))]
public interface IPatientService
{
//Your interface methdos
}
如果您需要更多详细信息和解释,可以通过 Mebyon Kernow查看this blog post。