Истекло время ожидания платформы Entity.NET 4.0

Я разрабатываю сайт ASP.NET с использованием MVC3,.NET framework 4.0 и Entity Framework. Когда я запускаю приложение и выполняю простой выбор базы данных SQL Server 2005, я получаю следующую ошибку:

"Исправлено System.Data.SqlClient.SqlException:" Истекло время ожидания. Период ожидания истекает до завершения операции или сервер не отвечает. "

Вот что. Я попытался войти в систему и выполнить тот же запрос из студии управления, и это сработало. Я разработал небольшое консольное приложение, использующее .NET framework 4.0 и инфраструктуру сущности, выполняющую тот же самый запрос, и он вернул необходимую мне информацию. Я даже переключился с использования инфраструктуры Entity на классы ADO.NET(SqlConnection и SqlCommand), а при выполнении выбора из экземпляра SqlCommand я получаю ту же ошибку.

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

Пожалуйста, не говорите мне, что решение заключается в увеличении тайм-аута, потому что запрос действительно маленький (20 записей), и, как я уже сказал, он отлично работал при запуске из консольного приложения с использованием той же технологии и даже тем же код, который я размещаю ниже.

Это код, который дает мне проблему:

MLIBEntities dbMLIB = new MLIBEntities();

var searchResults = (from s in dbMLIB.Sets
                     where s.setmap1.StartsWith(accountNumber)
                     select s);

return searchResults.ToList();

Исключение возникает при запуске searchResults.ToList();

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

<connectionStrings>
    <add name="MLIBEntities" connectionString="metadata=res://*/Models.MlibDBModel.csdl|res://*/Models.MlibDBModel.ssdl|res://*/Models.MlibDBModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=HERPADERP;Initial Catalog=MLIB;Integrated Security=True;MultipleActiveResultSets=True;Connect Timeout=200&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>

Я предполагаю, что это должна быть проблема конфигурации где-то в веб-приложении MVC, или я просто что-то пропустил в файле Web.config. У кого-нибудь из вас была эта проблема? Я знаю, что это действительно странно.

Благодарим вас за помощь. У меня действительно нет идей.

Последнее. Я запустил профайлер SQL, и похоже, что запрос никогда не попадает на сервер базы данных. Любые идеи, почему это могло произойти?

Ответ 1

Спасибо всем за вашу помощь. Похоже, что запрос действительно возвращал огромное количество записей, и это вызывало тайм-аут при запуске его из веб-приложения, когда это не происходило в консольном приложении, учитывая его характер.

Еще раз спасибо!

Ответ 2

У меня была та же проблема, и еще одна появилась позже, не относящаяся к MSSQL. Чтобы решить первую проблему (выполнение запросов заняло слишком много времени), я изменил command.CommandTimeout на использование большего числа (по умолчанию 30). Еще одна проблема, которая возникла, заключалась в том, что я использовал запланированное задание для запуска этого приложения - через 20 минут он сбросил бы ошибку

"Тема прерывается"

После просмотра ошибок журнала выяснилось, что пул приложений также имеет таймаут, а значение по умолчанию - 20 минут.

Ответ 3

Это может появиться как тайм-аут, но, возможно, это просто проблема с безопасностью.

Мой первый инстинкт заключается в том, что вы подключаетесь с помощью проверки подлинности Windows (Integrated Security = True), а веб-сайт работает под учетной записью (Network Service?), которая не имеет действительного входа для этого сервера.

Мой второй инстинкт заключается в том, что сервер Sql находится на другом компьютере, и проблема с брандмауэром.

Третий инстинкт заключается в том, что Sql Server не настроен на прием сетевых подключений через TCPIP. Запустите Sql Server Configuration Manager и убедитесь, что он прослушивает.

Ответ 4

У меня уже были таймауты с MultipleActiveResultSets = True в строке подключения, попробуйте отключить его, чтобы увидеть, есть ли проблема