Файл cookie ASP.NET_SessionId замедляет работу веб-сервера при выполнении нескольких запросов GET. - PullRequest
1 голос
/ 09 августа 2011

Я тестирую свое веб-приложение ASP.NET MVC2 с использованием MS VisualStudio 2010 Express и сервера разработки ASP.NET на http://localhost. ASP.NET Framework версии 4.

У меня есть страница со списком изображений, которые получены методом Action следующим образом:

[HTML code]

<img src="/images/thumb_79c7b9f0-5939-43e5-a6d0-d5e43f4e8947.jpg" alt="image">

[Настройка маршрутизации в Global.asax.cs]

public class MvcApplication : System.Web.HttpApplication
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.MapRoute(
            "Image",
            "images/{id}",
            new { controller = "Image", action = "Picture", id = "" }
        );
        // [...] other routing settings
    }
}

[Контроллер изображения]

public class ImageController : Controller
{
    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult Picture(string id)
    {
        try
        {
            return File(ImageBasePath + id, "image/jpeg");
        }
        catch (Exception)
        {
        }
    }

    private string ImageBasePath
    {
        get { return HttpContext.Request.PhysicalApplicationPath + WebConfigurationManager.AppSettings["dbImageBasePath"]; }
    }
}

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

Проблема здесь в том, что когда сеанс отсутствует (то есть, файл cookie ASP.NET_SessionId не существует для localhost), время для браузера получить изображения очень короткое (~ 10 мс), в то время как при ASP.NET_SessionId файл cookie существует, время увеличивается до 500 мс-1 с. Это происходит в любом браузере.

Я провел различные тесты и увидел, что если я получаю изображения без прохождения через приложение ASP.NET, файл cookie ASP.NET_SessionId не влияет на время загрузки.

Похоже, что несколько запросов HTTP GET с файлом cookie ASP.NET_SessionId, передаваемым веб-приложению, значительно замедляют само приложение.

У кого-нибудь есть объяснение столь странному поведению?

Большое спасибо.

UPDATE Описанная выше проблема возникает и на веб-сервере IIS7, поэтому она не относится к локальному серверу разработки ASP.NET.

1 Ответ

1 голос
/ 09 августа 2011

ASP.NET будет разрешать только один запрос за раз доступ к состоянию сеанса.Таким образом, все ваши запросы к изображениям будут сериализованы, и вы увидите большое время отклика.

Обходной путь - отключить состояние сеанса или установить его только для чтения.В ASP.NET это можно сделать с помощью атрибута SessionState:

[SessionState(SessionStateBehaviour.Disabled)]
public class ImageController : Controller
{
 ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...