如何在事件处理程序中获取HttpContext

时间:2009-10-21 14:49:35

标签: sharepoint httpcontext event-handling

我正在尝试在MOSS的文档库中的事件处理程序中获取HTTPContext,但我所拥有的只是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 个答案:

答案 0 :(得分:9)

第1步 声明:

    private HttpContext currentContext;
    static HttpContext _stCurrentContext;

第2步

currentContext = HttpContext.Current;      // in constructor

步骤3

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];

答案 1 :(得分:4)

当我在上传新文档时尝试更新文档库的某些自定义字段时遇到了同样的问题,该字段是(ProjectID)我把它放在我的webpart中的会话中(上传文档之前的步骤)

我做的是:我将projectID放入自定义webpart内的缓存(每个用户),该缓存充当会话,如下所示:

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 :(得分:2)

项目事件接收器异步运行;您将无法访问发起该事件的HTTP请求。

答案 3 :(得分:0)

如果从SharePoint界面(Internet Explorer)上载文档,则可以在SPList和文档库中捕获HttpContext。但是,如果您从Microsoft Word保存文档,则无法捕获HttpContext,我不知道为什么。

答案 4 :(得分:0)

尝试使用HttpRuntime类

答案 5 :(得分:0)

如果用户尝试上传一个文档,我可以从ItemAdding Event中获取会话对象,但问题是当用户使用文档libarary选项上传多个文档时,httpcontext.current始终为null(上传多个文档)< / p>

答案 6 :(得分:0)

您可以在事件接收器中伪造HttpContext和SPContext,如我的帖子中所述: http://pholpar.wordpress.com/2011/06/26/injecting-httpcontext-and-spcontext-into-the-event-receiver-context/

答案 7 :(得分:0)

如果将它放在这样的静态变量中,您也有多个人使用相同的上下文对象,该对象将是首次运行事件接收器的用户的上下文,并发更改可能会产生意外结果。

通过设计删除上下文以鼓励人们不使用它。您应该尝试尽可能多地使用公开的属性,以避免以后出现兼容性问题。 您可以从properties.Web.CurrentUser中获取用户名作为一个示例。

在事件接收器中使用静态变量很棘手,你必须记住,如果你有多个前端,静态变量中的数据在事件接收器实例运行的前端之外是不可用的。