Asp.net 当多个用户同时访问同一页面时在网站上获取错误

Asp.net 当多个用户同时访问同一页面时在网站上获取错误,asp.net,sql-server,entity-framework-4,Asp.net,Sql Server,Entity Framework 4,当多个用户访问同一页面时,我在ASP.NET 4网站上收到以下错误消息: 无法打开基础提供程序。在 System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf 等等 我使用EntityFramework4访问SQLServer2008数据库 页面有时会工作,因此我知道连接字符串是正确的。此外,数据库设置为多用户,我在连接字符串中将MARS设置为true 此外,在事件查看器中,我有时会收到SQL Server消息: 服务器将断开连

当多个用户访问同一页面时,我在ASP.NET 4网站上收到以下错误消息:

无法打开基础提供程序。在 System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf 等等

我使用EntityFramework4访问SQLServer2008数据库

页面有时会工作,因此我知道连接字符串是正确的。此外,数据库设置为多用户,我在连接字符串中将MARS设置为true

此外,在事件查看器中,我有时会收到SQL Server消息:

服务器将断开连接,因为客户端驱动程序 会话处于单用户模式时发送了多个请求

正如我所说,只有当我尝试在两台不同的机器上同时访问同一页面时,通过刷新页面或单击同一链接,才会发生这种情况

任何帮助都将不胜感激

添加的连接字符串(第一个用于ASPNETDB,第二个用于主数据库):


我相信您的问题是由将ObjectContext对象存储在静态变量中引起的

来自的msdn文档

ObjectContext类不是线程安全的。数据的完整性 在多线程中无法确保ObjectContext中的对象 情景


我相信您的问题是由将ObjectContext对象存储在静态变量中引起的

来自的msdn文档

ObjectContext类不是线程安全的。数据的完整性 在多线程中无法确保ObjectContext中的对象 情景



如何处理对象上下文的生存期?您必须为每个请求创建一个新的上下文实例。是的,我每次需要访问数据库时都会创建一个新的上下文。另外,据我所知,EF框架处理连接的打开和关闭。您是否使用任何代码将数据库更改为单用户模式?显示你的连接字符串。你能显示你创建/管理对象上下文的代码吗?现在已经在上面的原始文章中添加了代码和连接字符串。你如何处理对象上下文的生存期?您必须为每个请求创建一个新的上下文实例。是的,我每次需要访问数据库时都会创建一个新的上下文。另外,据我所知,EF框架处理连接的打开和关闭。您是否使用任何代码将数据库更改为单用户模式?显示你的连接字符串。你能显示你创建/管理对象上下文的代码吗?现在已经在上面的原始帖子中添加了代码和连接字符串。据我所知,我没有使用多个线程,所以这不重要,对吗?你没有,但是iis肯定要处理多个请求。每次使用ObjectContext时(在本例中是在GetCurrentNewsItems()方法中),我应该只声明它吗?如果我这样做了,使用静态类但不使用静态ObjectContext变量还可以吗?是的,使用静态方法很好,它将ObjectContext存储在静态变量中,这会导致问题。是的,这已经解决了问题。据我所知,我没有使用多个线程,所以这不重要,不是吗,但是iis肯定要处理多个请求。每次使用ObjectContext时(在本例中是在GetCurrentNewsItems()方法中),我应该只声明它吗?如果我这样做了,使用静态类但不使用静态ObjectContext变量还可以吗?是的,使用静态方法很好,它将ObjectContext存储在静态变量中导致了问题。是的,这已经解决了问题。
<add name="ApplicationServices" connectionString="Data Source=MyServer;Initial Catalog=MyDB;Integrated Security=False;Persist Security Info=False;User ID=****;Password=****;Connect Timeout=120" />

 <add name="MyDBEntities" connectionString="metadata=res://*/App_Code.MyDBModel.csdl|res://*/App_Code.MyDBModel.ssdl|res://*/App_Code.MyDBModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=MyServer;Initial Catalog=MyDB;Integrated Security=False;User ID=****;Password=****;Connect Timeout=120;User Instance=false;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using MyDBModel;
using System.Web.Security;

/// <summary>
/// Summary description for MyDataAccess 
/// </summary>
public static class MyDataAccess
{

    // Private Class Members
    //-----------------------------------------------------------------------------------------

    private static MyDBModel.MyDBEntities dal = new MyDBModel.MyDBEntities();

    // Class Constructor / Destructor
    //-----------------------------------------------------------------------------------------

    static MyDataAccess()
    {

        // Set Entity ObjectContext Merge Options - this basically ensures database items aren't cached
        dal.NEWS.MergeOption = System.Data.Objects.MergeOption.OverwriteChanges;
        dal.NEWS_IMAGES.MergeOption = System.Data.Objects.MergeOption.OverwriteChanges;

    }

    // Public Methods for Data Access
    //-----------------------------------------------------------------------------------------

    /// <summary>
    /// Get All Current News Items
    /// </summary>
    public static List<NEWS> GetCurrentNewsItems()
    {
        var items = from news in dal.NEWS
                    where news.NEWS_ACTIVE == true &&
                    news.NEWS_STARTDATE <= DateTime.Today &&
                    news.NEWS_EXPIRYDATE >= DateTime.Today
                    orderby news.NEWS_DATE descending
                    select news;

        return NewsManager.GetMyNewsItems(items).ToList();

    }
}
var news = MyDataAccess.GetCurrentNewsItems();