2

MOSS のドキュメント ライブラリのイベント ハンドラー内で HTTPContext を取得しようとしていますが、取得できるのは HTTPContext.Current の null 値だけです。リストに対して同じことを行うと、HTTPContext が返されます。HTTPContext.Request メソッドにアクセスするためにドキュメント ライブラリで HTTPContext を取得する方法はありますか?

ご協力いただきありがとうございます

コードは次のとおりです。

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;  
    }
}
4

8 に答える 8

9

ステップ 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];
于 2012-10-26T19:30:29.283 に答える
4

新しいドキュメントをアップロードするときにドキュメント ライブラリのいくつかのカスタム フィールドを更新しようとしたときに同じ問題に直面しました。そのフィールドは (ProjectID) で、Web パーツのセッション内に配置しました (ドキュメントをアップロードする前のステップ)。

私がしたことはprojectID次のとおりです。次のように、セッションとして機能するカスタム Web パーツ内のキャッシュに (ユーザーごとに) 入れました。

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)
    { }
}
于 2009-12-27T09:57:57.143 に答える
2

アイテム イベント レシーバーは非同期で実行されます。イベントを開始した HTTP リクエストにはアクセスできません。

于 2009-10-21T15:02:04.923 に答える
0

私の投稿で説明されているように、イベントレシーバーで HttpContext と SPContext を偽造できます: http://pholpar.wordpress.com/2011/06/26/injecting-httpcontext-and-spcontext-into-the-event-receiver-context/

于 2012-02-19T22:15:38.103 に答える
0

そのように静的変数に配置すると、イベント レシーバーを最初に実行したユーザーのコンテキストとなる同じコンテキスト オブジェクトを複数の人が使用することになり、同時変更によって予期しない結果が生じる可能性があります。

コンテキストは、人々がそれを使用しないようにするために設計によって削除されます。後で互換性の問題を回避するために、公開されているプロパティをできるだけ使用するようにしてください。一例として、properties.Web.CurrentUser からユーザー名を取得できます。

イベント レシーバーで静的変数を使用するのは注意が必要です。複数のフロント エンドがある場合、静的変数のデータは、イベント レシーバーのインスタンスが実行されるフロントエンドの外部では使用できないことに注意してください。

于 2014-09-10T20:45:18.887 に答える
0

SharePoint インターフェイス (Internet Explorer) からドキュメントをアップロードすると、SPList とドキュメント ライブラリの両方で HttpContext をキャッチできます。しかし、Microsoft Word からドキュメントを保存すると、HttpContext をキャッチできません。その理由はわかりません。

于 2009-10-22T14:04:20.403 に答える
0

ユーザーが 1 つのドキュメントをアップロードしようとすると、ItemAdding イベント内からセッション オブジェクトを取得できますが、問題は、ユーザーがドキュメント ライブラリ オプション (複数のドキュメントをアップロード) を使用して複数のドキュメントをアップロードすると、httpcontext.current が常に null になることです。

于 2009-12-25T11:02:03.337 に答える