asp.net jquery ajax - проблема статического веб-метода - PullRequest
0 голосов
/ 03 июня 2011

У меня есть веб-метод asp.net, который является статическим, и он будет удалять операции пользовательских файлов в БД.Имя_файла отправляется через jQuery в качестве входных данных.Но для соединения с БД мне нужно использовать статический объект DBconnection.

Когда несколько пользователей удаляют свой собственный файл из пользовательского интерфейса, jQuery будет использовать тот же статический метод, который использует один объект статического соединения.Таким образом, одновременно возникает несколько запросов. Будет ли это удалить только последний (последний запрос) файл пользователя, удаленный из БД?Если да, то как справиться с этим с помощью jquery-ajax в asp.net.

Пожалуйста, расскажите немного, если я указал что-то не так.

[Обновлено] Код на стороне сервера:

  public static void DeleteAttachment(int fileId, string fileLoc)
  {
   SqlDBAccess objDBAccessStat = new SqlDBAccess();
   .......
  }

Ответы [ 2 ]

3 голосов
/ 03 июня 2011

Вы можете использовать Webservice .

$.ajax({
  type: "POST",
  contentType: "application/json; charset=utf-8",
  url: "WebService.asmx/WebMethodName",
  data: "{}",
  dataType: "json"
});

И метод WebService не обязательно должен быть статичным.

[System.Web.Script.Services.ScriptService]
public class WebService : System.Web.Services.WebService
{
    [WebMethod]
    public void WebMethodName()
    {
         //Do your stuff here
    }
}
1 голос
/ 03 июня 2011

Очевидно, что если вы разделяете соединение с БД между несколькими запросами одновременно, то неизвестно, что произойдет.Это по определению undefined .

Что вам нужно сделать, это либо изолировать объект (сделать его нестатичным), либо ввести блокировку, которая заставит входящие запросы ждать бесконечно (до тех пор, покаоперация доступна).

Это не особенно сложно само по себе, но требует осторожности, чтобы не ввести мертвую блокировку.

Я рекомендую не делатьметод static, нестатический метод более изолирован и используется должным образом со своим собственным объектом соединения, поэтому не будет подвержен той же проблеме параллелизма.

Здесь важно то, что соединение с БД не является глобальнымобщий ресурс, когда несколько пользователей нажимают на этот метод, или что-то будет идти не так.

Просто измените его на что-то вроде этого:

static void WebMethod()
{
    using (var conn = ProviderFactory.CreateConnection("connection string goes here"))
    {
        conn.Open();
        // Do work here
    }
}

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

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