为了开始解释,我有一个名为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面前
答案 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
}
}