【问题标题】:Entity Framework Model With Children in WCF Service works only onceWCF 服务中带有子项的实体框架模型仅工作一次
【发布时间】:2015-09-30 13:30:05
【问题描述】:

首先解释一下,我有一个名为 VitalSign 的模型和一个名为 VitalSignValues 的模型。

在我的 VitalSign 模型中,我有以下代码:

[ForeignKey("IdVitalSign")]
public virtual ICollection<VitalSignValue> VitalSignValues { get; set; }

在我的 VitalSignValue 模型中:

public Guid IdVitalSign { get; set; }

我有一个默认管理器,它具有 getAll() 等基本功能,...

该项目包含多个 Web 服务,它们都可以正常工作,除了这个 (VitalSignService)。当我运行该服务时,即使使用 WCF 测试客户端并测试 getAll 函数,它也可以工作。

问题是 getAll 函数只能工作一次,当我再次尝试调用该函数时,我突然收到此错误:

接收到http://localhost/webservice/VitalSignService.svc 的 HTTP 响应时出错。这可能是由于服务端点绑定未使用 HTTP 协议。这也可能是由于服务器中止了 HTTP 请求上下文(可能是由于服务关闭)。有关详细信息,请参阅服务器日志。

我试图检查跟踪日志,但由于某种原因,它给我的唯一信息是:

ASP.Net 托管编译

AppDomain 卸载

这是错误日志(虽然它并没有真正包含对我来说很好的信息)

服务器堆栈跟踪: 在 System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException,HttpWebRequest 请求,HttpAbortReason abortReason) 在 System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan 超时) 在 System.ServiceModel.Channels.RequestChannel.Request(消息消息,TimeSpan 超时) 在 System.ServiceModel.Dispatcher.RequestChannelBinder.Request(消息消息,TimeSpan 超时) 在 System.ServiceModel.Channels.ServiceChannel.Call(字符串操作,布尔单向,ProxyOperationRuntime 操作,Object[] 输入,Object[] 输出,TimeSpan 超时) 在 System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage 方法调用,ProxyOperationRuntime 操作) 在 System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage 消息)

在 [0] 处重新抛出异常: 在 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg,IMessage retMsg) 在 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData,Int32 类型) 在 IVitalSignService.GetAllVitalSigns() 在 VitalSignServiceClient.GetAllVitalSigns()

内部异常: 底层连接已关闭:接收时发生意外错误。 在 System.Net.HttpWebRequest.GetResponse() 在 System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan 超时)

内部异常: 无法从传输连接读取数据:现有连接被远程主机强行关闭。 在 System.Net.Sockets.NetworkStream.Read(字节 [] 缓冲区,Int32 偏移量,Int32 大小) 在 System.Net.PooledStream.Read(字节 [] 缓冲区,Int32 偏移量,Int32 大小) 在 System.Net.Connection.SyncRead(HttpWebRequest request, Boolean userRetrievedStream, Boolean probeRead)

内部异常: 现有连接被远程主机强行关闭 在 System.Net.Sockets.Socket.Receive(Byte[] 缓冲区,Int32 偏移量,Int32 大小,SocketFlags socketFlags) 在 System.Net.Sockets.NetworkStream.Read(Byte[] 缓冲区,Int32 偏移量,Int32 大小)

编辑:

这里有更多信息:

在我的应用程序中,我调用了这个函数:

var client = new VitalSignServiceClient();
_vitalSigns = client.GetAllVitalSignsWithValues().ToList();
client.Close();

在我的服务中,我得到了这个功能:

public ICollection<VitalSign> GetAllVitalSignsWithValues()
{
    return _vitalSignManager.GetAll("VitalSignValues");
}

在我的通用管理器中,会发生这种情况:

public ICollection<TObject> GetAll(params string[] navigationProperties)
{
    var query = Context.Set<TObject>().AsQueryable();
    foreach (string navigationProperty in navigationProperties)
    query = query.Include(navigationProperty);
    var list = query.ToList<TObject>();
    return list;
}

当我尝试通过调试找到问题时,它确实进入了服务,进入了通用管理器并且它确实获得了 VitalSigns,只是客户端从 Web 服务检索数据的那一刻发生了错误并且一切都失败了。

还请记住,所有这些实际上都有效(但只有 10 次中的 1 次,所以可能只有在服务器刷新它或其他情况时)

已解决:删除了 IList 前面的“虚拟”

【问题讨论】:

  • 您能向我们展示一下服务功能,以及您使用该服务的代码吗?
  • 我添加了一些额外的信息。有人认为这可能与序列化有关吗?
  • 当您第二次调用该服务时,您是否请求与第一次相同的信息,并且在这些请求之间数据库中的信息是否发生了变化?这是否发生在其他功能中。尝试添加一些仅返回字符串的虚拟函数,看看是否会发生这种情况。另外,如果您不包含导航属性,请检查是否发生这种情况。
  • 我确实调用了相同的函数,没有任何改变,只是按下 WCF 测试客户端中的“调用”按钮,并在获得数据后再次按下它。这就是错误发生的时候。这不会发生在所有函数中,比如当我有一个名为 getAllVitalSignValues() 的函数只从 VitalSignValues 模型中获取行时,它确实可以正常工作
  • 我建议你然后打开WCF跟踪,看看服务引发了哪个异常。你可以找到更多here

标签: c# .net entity-framework wcf


【解决方案1】:

我不喜欢您关闭/处置 WCF 代理和 EF 上下文的方式。在那里找麻烦。如下所示查看“使用”。我还建议您不要使用静态 EF 上下文。通过这样做再次寻找麻烦。 (LinqToSql declare and instantiate DataContext best practice?)。第三,我知道创建一个可以做所有事情的通用存储库是很诱人的,但这最终会带来更多的工作而不是它的价值。出于测试、性能和可维护性的目的,请指定您的 API 调用。

试试:

using(var client = new VitalSignServiceClient()
{
    _vitalSigns = client.GetAllVitalSignsWithValues().ToList();
}

public ICollection<VitalSign> GetAllVitalSigns()
{
    using(ctx = new YourContext())
    {
       // do stuff
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多