0

サーバー側に単純な int を保存しようとしています。その後、すべてのユーザーがログインして更新できます。これは簡単な作業だと思い、設定デザイナーを使用しようとしましたが、アプリケーション設定は読み取り専用であるため、スコープを「アプリケーション」から「ユーザー」に変更できませんでした。

変数を XML ファイルに保存して変更できることはわかっていますが、もっと簡単な方法が必要だと思いました。

ユーザー プロファイルを使用しようとしましたが、うまくいきませんか? (Context.Profile も使用しました。)

<profile>
  <providers>
    <clear/>
    <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/>
  </providers>
  <properties>
    <add name="FilmNumber" type="int" allowAnonymous="true" defaultValue="2"/>
  </properties>
</profile>

コード:

//********Get poster Number*******
int LastPosterNumber=0;
LastPosterNumber = (int)HttpContext.Current.Profile.GetPropertyValue("FilmNumber");

string strFileName;
strFileName = FileField.PostedFile.FileName;
string c = (LastPosterNumber + 1).ToString();
string dirPath = System.Web.HttpContext.Current.Server.MapPath("~") + "/Images/FilmPosters/" + c + ".jpg";
FileField.PostedFile.SaveAs(dirPath);

//******Save new poster number*******
HttpContext.Current.Profile.SetPropertyValue("FilmNumber", int.Parse(c));
HttpContext.Current.Profile.Save();
4

1 に答える 1

0

設定ファイルを変更可能にする必要があるため、設定を避けるようにしてください。また、アプリケーションは常に W3C のワーカー プロセスのユーザー コンテキストで実行されるため、ASP.NET の「ユーザー設定」の概念は存在しません。.NET 設定 API はありません。 ASP.NET メンバーシップまたはその他の「ユーザー」の概念を認識しています。

最良のオプションはApplication、アプリケーションで DBMS、状態、または静的フィールド (の寿命を超えて永続化する必要がない場合w3wp.exe) またはディスク上のファイルを使用することです。XML シリアライゼーションを使用する必要はありません。手動で書き出す (ASP.NET アプリケーションはマルチスレッドであるため、必ず最初にファイルをロックしてください)。

私のアプリケーションでは、接続文字列と最低限の初期化設定のみweb.configを に保存し、ユーザーごとの設定をデータベース テーブルに保存し、このための単純な API レイヤーを記述します (通常はアプリケーション設定と継承または " EffectiveSettings" を使用)。これは、(実装に関する限り) .NET の設定 API とは完全に異なることに注意してください。これは、この回答で既に公布されているものを含め、さまざまな理由で完全に回避しています。

IIS w3wp.exe の寿命に関する注意事項:

IIS は、さまざまな理由でいつでも w3wp.exe を終了または "リサイクル" します。そのため、ASP.NET アプリケーションは、できるだけ近い機会に長期保存する必要があり、メモリ内の状態が失われます。これには次のような理由があります。

  • 非アクティブ。アプリケーション プールのワーカー プロセスが少なくとも 45 分 (またはそれくらい) 要求を処理しなかった場合、IIS はプロセスをシャットダウンします。
  • リサイクル。IIS は、約 90 分ごと (または 29 時間かもしれませんが、よくわかりません) にワーカー プロセスを終了して再起動することで、ワーカー プロセスがリソースをリークするのを予防します。
  • 無反応。IIS は、着信要求に応答するためにワーカー プロセスに厳密なタイムアウトを与えます。デフォルトは 60 秒だと思います。クライアントに応答が送信されない場合、プロセスは再起動されます。
  • メモリ制限に達しています。上記の自動時間ベースのリサイクルと同様に、IIS は、ワーカー プロセスがメモリ制限に達した場合に再起動します (そのため、リソースを管理することが重要です)。
  • リクエスト制限に達しています。ここでも、時間ベースの自動リサイクルと同様に、IIS は走行距離計が X 個の要求を読み取った後にワーカー プロセスを再起動します。これはデフォルトで無効になっていますが、ISP が有効にしている場合があります。
于 2013-03-15T01:02:23.023 に答える