WCF方法返回集合

时间:2017-09-11 13:47:47

标签: c# .net wcf serialization datacontractserializer

我有一个基类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>>,但它没有帮助。

有什么想法我需要做些什么才能归还收藏品?

2 个答案:

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