Получение ошибки на веб-сайте при одновременном доступе нескольких пользователей к одной странице - PullRequest
1 голос
/ 17 августа 2011

Я получаю следующее сообщение об ошибке на веб-сайте ASP.NET 4, когда несколько пользователей получают доступ к одной странице:

Базовый поставщик не смог открыть. в System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf и т.д ......

Я использую Entity Framework 4 для доступа к базе данных SQL Server 2008.

Страница иногда работает, поэтому я знаю, что строка подключения верна. Также для базы данных установлен многопользовательский режим, а для параметра MARS установлено значение true в строке подключения.

Также в средстве просмотра событий я иногда получаю сообщение SQL Server:

Сервер прервет соединение, потому что драйвер клиента имеет отправил несколько запросов, пока сеанс находится в однопользовательском режиме.

Как я уже сказал, это происходит только в том случае, если я пытаюсь получить доступ к одной и той же странице одновременно на двух разных компьютерах, просто обновив страницу или щелкнув по одной и той же ссылке.

Любая помощь будет высоко ценится.

Добавлены строки подключения (первая для ASPNETDB и вторая для основной базы данных):

<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();

    }
}

Тогда на моей странице .aspx.cs я бы использовал что-то вроде:

var news = MyDataAccess.GetCurrentNewsItems();

1 Ответ

6 голосов
/ 17 августа 2011

Я полагаю, что ваша проблема вызвана хранением объекта ObjectContext в статической переменной.

из документации MSDN ObjectContext Class

Класс ObjectContext не является потокобезопасным. Целостность данных объекты в ObjectContext не могут быть обеспечены в многопоточном сценарии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...