Как получить HttpContext в обработчике событий - PullRequest
2 голосов
/ 21 октября 2009

Я пытаюсь получить HTTPContext в обработчике событий в библиотеке документов в MOSS, но все, что у меня есть, это нулевое значение HTTPContext.Current, я делаю то же самое в List, и возвращается HTTPContext. Есть ли способ получить HTTPContext в библиотеках документов для доступа к методу HTTPContext.Request?

Спасибо за вашу помощь

Вот код:

public class TestContextListItemEventReceiver : SPItemEventReceiver
{
    HttpContext current;
    static object obj;

    /// <summary>
    /// Initializes a new instance of the Microsoft.SharePoint.SPItemEventReceiver class.
    /// </summary>
    public TestContextListItemEventReceiver()
    {
        current = HttpContext.Current;
    }

    public override void ItemAdding(SPItemEventProperties properties)
    {
        obj = current;  
    }
}

Ответы [ 8 ]

9 голосов
/ 26 октября 2012

Шаг 1 Объявите:

    private HttpContext currentContext;
    static HttpContext _stCurrentContext;

Шаг 2

currentContext = HttpContext.Current;      // in constructor

Step3

public override void ItemAdding(SPItemEventProperties properties)
                 _stCurrentContext = currentContext;

Шаг 4

 public override void ItemAdded(SPItemEventProperties properties)
 if (_stCurrentContext.Request.Files[0].ContentLength > 0)
 HttpPostedFile uploadfile = _stCurrentContext.Request.Files[0];
4 голосов
/ 27 декабря 2009

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

Что я сделал: я поместил projectID в кеш (для каждого пользователя) внутри пользовательской веб-части, которая действует как сеанс следующим образом:

if (Request.QueryString["ProjectID"] != null)
{
     HttpRuntime.Cache.Remove(SPContext.Current.Web.CurrentUser.LoginName);
     HttpRuntime.Cache.Add(SPContext.Current.Web.CurrentUser.LoginName,
                           ProjectID, null, DateTime.UtcNow.AddMinutes(60),
                           System.Web.Caching.Cache.NoSlidingExpiration,
                           System.Web.Caching.CacheItemPriority.Normal, null);
}

Затем я реализовал событие ItemAdded и получаю значение кэшированного projectId через:

public override void ItemAdded(SPItemEventProperties properties)
{
    try
    {
        string ProjID = "";

        string CreatedBy = null;
        if (properties.ListItem["Created By"] != null)
            CreatedBy = properties.ListItem["Created By"].ToString().Split(';')[1].Replace("#","");

        if (HttpRuntime.Cache[CreatedBy] != null)
        {  
            //SPContext.Current.Web.CurrentUser.LoginName;
            ProjID = HttpRuntime.Cache[CreatedBy].ToString();

            if (properties.ListItem["Project"] == null)
            {
                properties.ListItem["Project"] = new SPFieldLookupValue(ProjID);
                properties.ListItem.SystemUpdate();
            }

            base.ItemAdded(properties);
        }
    }
    catch (Exception ex)
    { }
}
2 голосов
/ 21 октября 2009

Приемник события элемента работает асинхронно; у вас не будет доступа к HTTP-запросу, который инициировал событие.

0 голосов
/ 11 сентября 2014

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

Контекст удален, чтобы побудить людей не использовать его. Вы должны попытаться использовать свойства, которые представлены как можно больше, чтобы избежать проблем совместимости позже. Вы можете получить имя пользователя из properties.Web.CurrentUser в качестве одного примера.

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

0 голосов
/ 20 февраля 2012

Вы можете подделать HttpContext и SPContext в получателях событий, как описано в моем посте: http://pholpar.wordpress.com/2011/06/26/injecting-httpcontext-and-spcontext-into-the-event-receiver-context/

0 голосов
/ 25 декабря 2009

Я могу получить объект сеанса из события ItemAdding, если пользователь пытается загрузить один документ, но проблема в том, что httpcontext.current всегда равен нулю, когда пользователь загружает несколько документов, используя опцию libarary документа (загрузить несколько документов)

0 голосов
/ 25 октября 2009

Попробуйте использовать класс HttpRuntime

0 голосов
/ 22 октября 2009

Вы можете перехватить HttpContext как в библиотеках SPList, так и в библиотеках документов, если загружаете документ из интерфейса SharePoint (Internet Explorer). Но если вы сохраните документ из Microsoft Word, HttpContext не может быть перехвачен, я не знаю почему.

...