WCF服务中包含子项的实体框架模型只能运行一次

时间:2015-09-30 13:30:05

标签: c# .net entity-framework wcf

为了开始解释,我有一个名为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 request,HttpAbortReason abortReason)      at System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)      在System.ServiceModel.Channels.RequestChannel.Request(消息消息,TimeSpan超时)      在System.ServiceModel.Dispatcher.RequestChannelBinder.Request(消息消息,TimeSpan超时)      在System.ServiceModel.Channels.ServiceChannel.Call(String action,Boolean oneway,ProxyOperationRuntime operation,Object [] ins,Object [] outs,TimeSpan timeout)      在System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall,ProxyOperationRuntime操作)      在System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

     

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

     

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

     

内部例外:   无法从传输连接读取数据:远程主机强制关闭现有连接。      在System.Net.Sockets.NetworkStream.Read(Byte []缓冲区,Int32偏移量,Int32大小)      在System.Net.PooledStream.Read(Byte []缓冲区,Int32偏移量,Int32大小)      在System.Net.Connection.SyncRead(HttpWebRequest请求,布尔userRetrievedStream,布尔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次,所以可能只有在服务器刷新它或其他东西时)

已解决:删除了&#34;虚拟&#34;在IList面前

1 个答案:

答案 0 :(得分:0)

我不喜欢你关闭/处理你的WCF代理和EF上下文的方式。在那里寻找麻烦。查看&#34;使用&#34;如下。我还建议你不要使用静态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
    }
}