Asp.Net MVC двойная отправка / запрос разрывает соединение SQL - PullRequest
1 голос
/ 08 июля 2010

У меня странная проблема, которую я не до конца понимаю.Основным симптомом является то, что когда я дважды щелкаю ссылку (которая указывает на действие контроллера) в моем приложении MVC, соединение с сервером базы данных разрывается, и я получаю ошибку:

Выполнение команды требует открытияи доступное соединение.Текущее состояние соединения нарушено.

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

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

Спасибо,

ржавый

Обновление:

A.) Я неправильно пометил это как Linq-to-sql, когда мыфактически используют Linq-to-entity.B.) Объект подключения определяется как переменная-член контроллера:

namespace C2S.Controllers
{
    public class ArtifactController : Controller
    {
        private c2sEntities _entities = new c2sEntities();
        ...

Я заметил, что в некоторых руководствах asp.net они объявляют переменную в том же месте, но имеют отдельный конструктор дляконтроллер, где инициализируется объект db.Имеет ли это какое-то значение?

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

Может быть, я чего-то не понимаю в настройке моих классов linq-to-entity или природы соединения с базой данных,У кого-нибудь есть мысли?Я действительно даже не знаю, как исследовать это!

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

Расти

Ответы [ 2 ]

3 голосов
/ 08 июля 2010

Сложно сказать по вашему описанию проблемы, но первое предположение будет следующим:

Является ли ваш объект соединения статическим (т.е. уровень контроллера или приложения) или определен локально в рамках действия?Двойной щелчок по ссылке вызовет событие дважды, и это будет похоже на то, что вы здесь описываете.Таким образом, первый вызов создает соединение, затем поступает второй и перебивает весь первый вызов метода, разрывая соединение, которое, как он считает, имеет.

Редактировать: проблема возникает только при двойном щелчке.Работает ли это так, как ожидается, если вы нажмете только один раз по ссылке?Пример кода, о котором идет речь, поможет.

1 голос
/ 08 июля 2010

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

using(SqlConnection conn = new SqlConnection("connstring")) {
  using (SqlCommand cmd = new SqlCommand("SQLSTATEMENT", conn)) {
    // more code here......
  } 
}

Это обеспечит закрытие вашего соединения, даже если в вашем коде где-то есть ошибка.

Узнайте все об этом здесь: http://davidhayden.com/blog/dave/archive/2005/01/13/773.aspx

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