2

dataAceess レイヤーで HttpContext を使用しようとしましたが、HttpContext からオブジェクトを作成できません

 HttpContext httpContext = HttpContext.Current;

Web アプリケーションと libery プロジェクトを作成し、次のように libery プロジェクトで HttpContext を使用したいと考えています。

public static Context GetContextPerRequest()
   {

       HttpContext httpContext = HttpContext.Current;
       if (httpContext == null)
       {
           return new Context();
       }
       else
       {
           int contextId = Thread.CurrentContext.ContextID;
           int hashCode = httpContext.GetHashCode();
           string key = string.Concat(hashCode, contextId);

           Context context = httpContext.Items[key] as Context;
           if (context == null)
           {
               context = new Context();
               httpContext.Items[key] = context;
           }

           return context;
       }
   }

私は.net 4を使用しています。

4

3 に答える 3

3

HttpContext.Currentプレゼンテーション層から解析し、以下のようにメソッドを変更できます。現在の http コンテキストにアクセスする方法を見つける必要がある場合は、このリンクが役に立ちます。

   public static Context GetContextPerRequest(HttpContext httpContext)
   {
      ------
      ------
   }
于 2012-04-15T13:08:22.563 に答える
1

あなたの質問が何であるかわかりませんが、あなたのコードはいくつかの非常に悪い概念を示しています。

これは何をすると思いますか?

int contextId = Thread.CurrentContext.ContextID;
int hashCode = httpContext.GetHashCode();
string key = string.Concat(hashCode, contextId);

Context context = httpContext.Items[key] as Context;
if (context == null)
{
    context = new Context();
    httpContext.Items[key] = context;
}

HttpContextASP.NET で HTTP 要求を処理するための安全なストレージです。HttpContext.Currentすべてのリクエストに対して一意のインスタンスを返します。このインスタンスは、リクエストを処理するスレッドに依存しません。非同期処理でも、HttpContextリクエストはスレッドからスレッドへと流れますが、同じリクエストで 2 つのスレッドが動作することはありません (自分のスレッド)。HttpContext独自のスレッドを生成しようとすると、インスタンスはリクエストが処理されるまでしか存在しないため、この方法はまったく使用できませんが、カスタム スレッドの有効期間は長くなる可能性があります。

したがって、使用しているコードは、これの過度に複雑なバージョンです。

Context context = httpContext.Items["Context"] as Context;
if (context == null)
{
    context = new Context();
    httpContext.Items["Context"] = context;
}

また、このコードがデータ アクセス レイヤーからのものである場合、設計が間違っています。データ アクセス層はデータ アクセスを処理し、上位の処理 (HTTP 要求処理を含む) から独立している必要があります。GetContextPerRequestメソッドがデータ アクセス層に属していないことを意味します。

于 2012-04-15T13:09:13.250 に答える
-1

私はこの方法で私の問題を解決します:

  1. system.web への参照を追加
  2. system.web の使用; 私のデータアクセスレイヤーで
  3. メソッド コンストラクターの GetContextPerRequest() からオブジェクトを作成する
于 2012-04-16T18:47:00.823 に答える