【问题标题】:Cannot transfer a list:The underlying connection was closed无法传输列表:基础连接已关闭
【发布时间】:2013-12-19 16:06:34
【问题描述】:

我在 WCF 服务中的对象内传递列表时遇到问题。我有这门课:

[DataContract]
public class Field
{
    /*Necessary Information*/
    [DataMember]
    public int ID { get; set; }
    [DataMember]
    public String Picture { get; set; }
    [DataMember]
    public double TypicalAge { get; set; }
    [DataMember]
    public List<Report> ReportHistory { get; set; }
}

[DataContract]
public class Report
{
    [DataMember]
    public long ID { get; set; }
    [DataMember]
    public ReportTypes Type { get; set; }
    [DataMember]
    public int FieldID { get; set; }
    [DataMember]
    public String Head { get; set; }
    [DataMember]
    public String Body { get; set; }
    [DataMember]
    public DateTime TimeStamp { get; set; }
}

当报告列表为空或大小为 1 时,一切正常。 当列表大小大于 1 时,我收到此错误:

The underlying connection was closed: The connection was closed unexpectedly..

服务器中的代码:

public List<Field> GetFieldsByIDs(List<int> listOfIDs)
    {
        var result = new List<Field>();
        using (var context = new FieldBookEntities())
        {
            var fields = context.FieldEntities.Where(x => listOfIDs.Contains(x.ID)).Select(FieldEntityToField).ToList();
            for (int i = 0; i < listOfIDs.Count; i++)
            {
                var field = fields.FirstOrDefault(x => x.ID == listOfIDs.ElementAt(i));
                if (field != null)
                    result.Add(field);
            }
        }



        return result;
    }

客户端中的代码:

 client = new FieldServiceClient();
 var fieldsByIDs = client.GetFieldsByIDs(new int[] { 1, 2 });

界面:

public interface IFieldService
{

    [OperationContract]
    bool CheckConnection();


    [OperationContract]
    List<Field> GetFieldsByIDs(List<int> listOfIDs); //max 30 fields
}

我该怎么办?

【问题讨论】:

  • 显示错误代码。
  • 你为什么传递int[]而不是List&lt;int&gt;
  • 服务器以某种方式请求一个数组。没关系,因为我得到了服务器的完整列表
  • 你能添加你的服务接口吗
  • 我解决了这个问题。数据库中的信息不喜欢枚举中的信息,因此将其更改为枚举中的数字即可修复它

标签: c# .net wcf entity-framework webclient


【解决方案1】:

尝试添加:

context.Configuration.LazyLoadingEnabled = false;

之后

using (var context = new FieldBookEntities())
{

另外,更改以下内容:

var fields = context.FieldEntities.Where(x => listOfIDs.Contains(x.ID)).Select(FieldEntityToField).ToList();

收件人:

var fields = context.FieldEntities.Include("ReportHistory").Where(x => listOfIDs.Contains(x.ID)).Select(FieldEntityToField).ToList();

【讨论】:

  • 没用!。在我这样做之后(context.ContextOptions.LazyLoadingEnabled = false;),上下文返回服务器中的空报告列表!所以无论如何,客户得到一个空列表,而删除这一行有 7 个报告。尝试通过这些报告给我上面的错误。
  • 修改了我的答案 - 这样排序了吗?
  • 好吧,它修复了服务器中缺少的报告。但是还是不行!当客户端尝试从函数中获取答案时,我仍然会收到错误消息。
【解决方案2】:

我解决了这个问题。数据库中的信息不喜欢枚举中的信息,因此将其更改为枚举中的数字即可修复它。不是代码问题。

【讨论】:

    猜你喜欢
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 2018-03-29
    • 2019-03-01
    • 2013-12-22
    • 1970-01-01
    相关资源
    最近更新 更多