WCF服务中的带子实体框架模型只工作一次

本文关键字:工作 一次 模型 框架 服务 实体 WCF | 更新日期: 2023-09-27 18:15:22

为了开始解释,我有一个叫做VitalSign的模型和一个叫做VitalSignValues的模型。

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

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

在我的VitalSignValue模型:

public Guid IdVitalSign { get; set; }

我得到了一个默认的管理器,具有基本的功能,如getAll(),…

项目包含多个web服务,它们都工作得很好,除了这个(VitalSignService)。当我运行服务时,即使使用WCF测试客户端并测试gettall函数,它也能工作。

问题是getAll函数只工作一次,当我试图再次调用该函数时,我突然得到这个错误:

在接收到http://localhost/webservice/VitalSignService.svc的HTTP响应时发生错误。这可能是由于服务端点绑定没有使用HTTP协议。这也可能是由于服务器终止了HTTP请求上下文(可能是由于服务关闭)。查看服务器日志了解更多详细信息。

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

ASP。. Net托管编译

AppDomain卸货

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

服务器堆栈跟踪:在System.ServiceModel.Channels.HttpChannelUtilities。ProcessGetResponseWebException(WebException, HttpWebRequest请求,HttpAbortReason abortReason)httprequestchannel.httpchannelrequest 1. System.ServiceModel.Channels.HttpChannelFactory"。WaitForReply(时间间隔超时)在System.ServiceModel.Channels.RequestChannel。请求(消息消息,超时时间)在System.ServiceModel.Dispatcher.RequestChannelBinder。请求(消息消息,超时时间)在System.ServiceModel.Channels.ServiceChannel。调用(String action, Boolean单向,ProxyOperationRuntime操作,Object[] in, Object[] outs, TimeSpan timeout)在System.ServiceModel.Channels.ServiceChannelProxy。调用方法调用方法调用,ProxyOperationRuntime操作在System.ServiceModel.Channels.ServiceChannelProxy。调用(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 ()httprequestchannel.httpchannelrequest 1. System.ServiceModel.Channels.HttpChannelFactory"。WaitForReply(时间间隔超时)

内部例外:无法从传输连接读取数据:远程主机强制关闭了现有连接。在System.Net.Sockets.NetworkStream。读取(Byte[] buffer, Int32偏移量,Int32大小)在System.Net.PooledStream。读取(Byte[] buffer, Int32偏移量,Int32大小)在System.Net.Connection。SyncRead(HttpWebRequest请求,Boolean userRetrievedStream, Boolean probeRead)

内部例外:远程主机强制关闭了现有连接在System.Net.Sockets.Socket。接收(Byte[] buffer, Int32偏移量,Int32大小,SocketFlags SocketFlags)在System.Net.Sockets.NetworkStream。Read(Byte[] buffer, Int32 offset, Int32 size)

编辑:

这里是一些更多的信息:

在我的应用程序中,我调用这个函数:
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服务检索数据的那一刻,错误发生并且一切都失败了。

还要记住,所有这些实际上都是有效的(但只有1/10次,所以可能只有当服务器刷新它或什么的时候)

SOLVED:移除了illist前面的"virtual"

WCF服务中的带子实体框架模型只工作一次

我不喜欢你关闭/处理WCF代理和EF上下文的方式。那是自找麻烦。看看下面的"using"。我还建议不要使用静态EF上下文。这样做又是自找麻烦。(LinqToSql声明和实例化DataContext的最佳实践?)第三,我知道创建一个通用的存储库是很诱人的,但这最终会带来比它的价值更多的工作。为了测试、性能和可维护性的目的,让你的API调用特定。

试题:

using(var client = new VitalSignServiceClient()
{
    _vitalSigns = client.GetAllVitalSignsWithValues().ToList();
}
public ICollection<VitalSign> GetAllVitalSigns()
{
    using(ctx = new YourContext())
    {
       // do stuff
    }
}