【问题标题】:WCF - An existing connection was forcibly closed by the remote hostWCF - 现有连接被远程主机强行关闭
【发布时间】:2016-05-01 03:23:44
【问题描述】:

您好,当我在客户端收到此错误时,我正在尝试使用此 WCF 服务 我在网上搜索了一些解决方案,但它们暗示循环依赖和无法序列化复杂对象,这对我来说并非如此

这就是我要发送的 DataContract

[DataContract]
public class CapitalDTO
{
    [DataMember]
    public string ItemName { get; set; }
    [DataMember]
    public string ItemSize { get; set; }
    [DataMember]
    public string ItemBranch { get; set; }
    [DataMember]
    public double ItemPrice { get; set; }
    [DataMember]
    public int ItemCount { get; set; }
    [DataMember]
    public double Capital
    {
        get
        {
            return (double)ItemCount * ItemPrice;
        }
    }

}

这就是试图发送它的服务

    public IEnumerable<CapitalDTO> GetCapital(int? BranchId = null)
    {
        using (var scope = container.BeginLifetimeScope())
        {
            unitOfWork = scope.Resolve<IUnitOfWork>();
            var capital = unitOfWork.ItemsInBrranches.GetItemsInBranchesByBranch(BranchId).Select(c => new CapitalDTO
            {
                ItemBranch = c.Branch.Name,
                ItemName = c.Item.Name,
                ItemPrice = c.Item.Price,
                ItemSize = c.Item.Size.Size,
                ItemCount = c.Amount
            });
            return capital;
        }
    }

因为我仍然被认为是 WCF 新手,所以我不确定我的问题出在哪里,我需要一些帮助

更新: 只有返回对象的方法才会返回这个异常,所以我猜这毕竟可能是一个序列化问题0

【问题讨论】:

    标签: c# wcf


    【解决方案1】:

    猜测-我怀疑所有属性都需要公共设置器,以便可以在客户端进行反序列化。由于“资本”是一个计算属性,我建议完全删除它,或者向它添加一个“虚拟”设置器,只有反序列化器会调用它,并且实际上不会做任何事情。

    【讨论】:

    • @C-Knight 好吧,我尝试省略 capital 属性,但这也没有用,我不认为这是问题
    【解决方案2】:

    好吧,显然问题在于解决生命范围内的 unitofwork 依赖关系,它似乎在 WCF 服务完成之前与 DbContext 一起处理

    public IEnumerable<CapitalDTO> GetCapital(int? BranchId = null)
    {
            unitOfWork = container.Resolve<IUnitOfWork>();
            var capital = unitOfWork.ItemsInBrranches.GetItemsInBranchesByBranch(BranchId).Select(c => new CapitalDTO
            {
                ItemBranch = c.Branch.Name,
                ItemName = c.Item.Name,
                ItemPrice = c.Item.Price,
                ItemSize = c.Item.Size.Size,
                ItemCount = c.Amount
            });
            return capital;
    }
    

    另一件事,正如 C. Knight 指出的,我应该定义一个公共设置器,以便对 Capital 属性进行序列化

    【讨论】:

      猜你喜欢
      • 2021-05-12
      相关资源
      最近更新 更多