PageParser.GetCompiledPageInstance вызывает исключение SecurityException - как это исправить? - PullRequest
0 голосов
/ 01 мая 2011

Справочная информация: я создал собственный HttpHandler, который выполняет определенную команду на основе опубликованных пользователем параметров. Поскольку JQuery Ajax интенсивно используется на моем веб-сайте, я принял подход к контентным страницам, в котором я выполняю страницу aspx, содержащую контент для страницы контейнера, просматриваемой пользователем. На данный момент я использую общий хостинг Godaddy и, поскольку сайт находится в зачаточном состоянии, я не могу перейти на выделенный / виртуальный сервер.

Все отлично работает на моем ПК, но не на сервере. Я получаю эту ошибку:

[SecurityException: Request for the permission of type 'System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
failed.]
   System.Web.UI.PageParser.GetCompiledPageInstance(String virtualPath, String inputFile, HttpContext context) +46
   SL.Controller.Commands.CommandHelper.ExecutePage(SLActionInfo actionInfo, String url) +95
   SL.Controller.Commands.ProductCommand.Execute(SLActionInfo actionInfo) +32
   SL.Controller.CommandFactory.ExecuteCommand(HttpContext context) +224
   SL.Controller.DefaultHttpHandler.ProcessRequest(HttpContext context) +20
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +181
....

Странная вещь: Server.Execute (строка virtualUrl) работает, а PageParser.GetCompiledPageInstance - нет.

Почему я использую PageParser.GetCompiledPageInstance, а не Server.Execute (строка URL)? Из-за следующего кода:

public static string ExecutePage(SLActionInfo actionInfo, string url)
        {
            var context = actionInfo.Context;
                        var sw = new System.IO.StringWriter();
            HtmlTextWriter htw = new HtmlTextWriter(sw);
            IHttpHandler handler = PageParser.GetCompiledPageInstance(url, context.Server.MapPath(url), context);
            if (handler is SL.UI.SLPageBase)
                ((SL.UI.SLPageBase)handler).ActionInfo = actionInfo;
            context.Server.Execute(handler, htw, true);
            return sw.ToString();
        }

Поскольку мои страницы контента происходят от SLPageBase (подкласс страницы), который имеет свойство ActionInfo, которое необходимо установить в этом методе ExecutePage, я использую подход PageParser.

Я не знаю, как избавиться от этой ошибки, не нарушая мой подход PageParser.

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 09 мая 2011

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

Редактировать: Я решил не принимать мой ответ немедленно.Я с нетерпением жду комментариев к этому ответу и приму соответствующее решение через несколько дней.

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

Изменение происходит в двух местах:

1) В методе ExecutePage:

public static string ExecutePage(SLActionInfo actionInfo, string url)
{
    var context = actionInfo.Context;
    var sw = new System.IO.StringWriter();
    HtmlTextWriter htw = new HtmlTextWriter(sw);
    // The original approach is commented out.
    // IHttpHandler handler = PageParser.GetCompiledPageInstance(url, context.Server.MapPath(url), context);
    // if (handler is SL.UI.SLPageBase)
    // ((SL.UI.SLPageBase)handler).ActionInfo = actionInfo;
    // context.Server.Execute(handler, htw, true);

    // The new approach:
    // Add actionInfo to the Items collection so that any page executing in the context of this request can read it.
    Context.Items.Add("SLActionInfo", actionInfo);
    // Now execute the page by providing its url.
    context.Server.Execute(url, htw, true);

    return sw.ToString();
}

2) Другое изменение находится в SLPageBase.ActionInfoсвойство:

public SLActionInfo ActionInfo
{
    get
    {
        return (SLActionInfo)Context.Items["SLActionInfo"];
        // Commented out the old approach.
        // return _actionInfo;
    }
}

Вы можете видеть, как легко, если я хочу вернуться к старому (и предпочтительному) подходу.Просто раскомментируйте несколько строк здесь и комментируйте несколько строк, которые помогут вам.Остальная часть системы останется неизменной.

...