【发布时间】: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