2

私は通常Cookieを使用しませんが、これと私が通常使用するSession変数を調べたいと思いました。

Cookieを設定してすぐに読み取ろうとすると、設定したばかりの値が返されません。

ただし、ページを更新するか、ブラウザを閉じて再度開くと、Cookieが設定されているように見えます。

Chromeでこれをデバッグしています。それは何か違いがありますか?

public const string COOKIE = "CompanyCookie1";
private const int TIMEOUT = 10;

private string Cookie1 {
  get {
    HttpCookie cookie = Request.Cookies[COOKIE];
    if (cookie != null) {
      TimeSpan span = (cookie.Expires - DateTime.Now);
      if (span.Minutes < TIMEOUT) {
        string value = cookie.Value;
        if (!String.IsNullOrEmpty(value)) {
          string[] split = value.Split('=');
          return split[split.Length - 1];
        }
        return cookie.Value;
      }
    }
    return null;
  }
  set {
    HttpCookie cookie = new HttpCookie(COOKIE);
    cookie[COOKIE] = value;
    int minutes = String.IsNullOrEmpty(value) ? -1 : TIMEOUT;
    cookie.Expires =  DateTime.Now.AddMinutes(minutes);
    Response.Cookies.Add(cookie);
  }
}

以下は私がそれを使用する方法です:

public Employee ActiveEmployee {
  get {
    string num = Request.QueryString["num"];
    string empNum = String.IsNullOrEmpty(num) ? Cookie1 : num;
    return GetActiveEmployee(empNum);
  }
  set {
    Cookie1 = (value != null) ? value.Badge : null;
  }
}

これは私がそれを呼んでいる方法です、ここでそれはから読み取られているようにNULLRequest.QueryString["num"]を返します:Cookie1

ActiveEmployee = new Employee() { Badge = "000000" };
Console.WriteLine(ActiveEmployee.Badge); // ActiveEmployee is NULL

...しかし、からの読み取りCookie1もnullを返します。

Cookieの値をすぐに利用できるようにするために呼び出す必要のあるCommit()のようなコマンドはありますか?

4

4 に答える 4

6

CookieはSessionとは異なります。Cookieコレクションは1つではなく、 2つあります。

Request.Cookies != Response.Cookies。前者は、ブラウザがページを要求したときにブラウザから送信されるCookieのセットであり、後者は、コンテンツとともに返送するものです。これは、純粋にMicrosoftの構成であるSessionとは異なり、CookieのRFCの性質を明らかにしています。

于 2012-05-31T20:22:35.677 に答える
5

応答にCookieを設定しても、要求Cookieコレクションに魔法のように転送されることはありません。応答にあり、そこで自由に確認できますが、次のリクエストでブラウザから実際に送信されるまで、リクエストオブジェクトには表示されません。

于 2012-05-31T20:22:15.803 に答える
2

他の回答に追加するには、Cookieがまだ更新されていない場合に備えて、値をプライベート変数にキャッシュすることで問題を回避できます。

private string _cookie1Value = null;
private string Cookie1 {
  get {
    if (_cookie1Value == null)
    {
      // insert current code
      _cookie1Value = cookie.Value;
    }
    return _cookie1Value;
  }
  set {
    // insert current code
    _cookie1Value = value;
  }
}
于 2012-05-31T20:25:34.497 に答える
1

簡単に言えば、応答として設定されたCookieは、次のhtppリクエスト(ブラウザからの次のgetまたはpostアクション)でのみ使用できます。

詳細:Cookie値がHttpResponseに設定されている場合、応答がクライアントに到達した後にのみ永続化/保存されます(つまり、ブラウザーはHttp ResponseヘッダーからCookie値を読み取り、保存します)。したがって、技術的には、今後のリクエストに対してのみ利用可能になります。たとえば、ユーザーがこのサイクルの後にブラウザからサーバー呼び出しを行うリンクまたはボタンをクリックした場合。

これがあなたにいくつかのアイデアを与えることを願っています、私はあなたがそれを使用する前にクッキーとASP.NETがそれをラップするものを読むことをお勧めします。

于 2012-05-31T20:50:18.137 に答える