0

ASP.NET C# Web アプリケーションは、次の環境で使用されます。

  • .NET フレームワーク 4
  • Silverlight 4 / ピボットビューア
  • IIS7
  • Windows 2008
  • Visual Studio 2010 .NET IDE
  • C#
  • HTTPS (SSL)

Silverlight 4 / PivotViewer コントロールは、明らかに ASP.NET ページに埋め込まれています。

まれに、IIS 7 を使用するスタンドアロンの Windows 2008 サーバーで Silverlight 4 / PivotViewer モジュールをホストする ASP.NET ページをナビゲートすると、「オブジェクト参照がオブジェクトのインスタンスに設定されていません。」というエラーが発生します。

また、エラーについて非常に奇妙なことがいくつかあります。第 1 に、特定のユーザー コンピューターで時々しか発生しません。詳しく説明すると、通常、ユーザーが ASP.NET Web アプリケーションに初めてアクセスするコンピューターを使用するときにのみ発生します。

さらに、ブラウザのキャッシュをクリアすると、Silverlight 4 / PivotViewer モジュールをホストする ASP.NET ページをナビゲートするときにエラーは発生しません。

このエラーに関するもう 1 つの興味深い側面は、実際には IIS 7 を使用してスタンドアロンの Windows 2008 サーバーにデプロイされているときに、エラー スタック トレースでローカルの開発用コンピューターの絶対パスを参照していることです。 IIS 7 を搭載したスタンドアロンの Windows 2008 サーバーでは、web.config などのファイル内のすべての構成パラメーターがスタンドアロン サーバー環境を参照していることを確認します。つまり、ローカルの開発用コンピューターに関連付けられている構成パラメーター値への参照をすべて削除します。

したがって、エラー スタック トレースでローカルの開発用コンピューターの絶対パスを参照する理由がわかりません。

サイトの使用中に「オブジェクト参照がオブジェクトのインスタンスに設定されていません。」というメッセージがユーザーに表示されるのは、ユーザー エクスペリエンスに悪影響を及ぼします。エラーが表示されるたびにキャッシュします。

「/」アプリケーションでサーバー エラーが発生しました。オブジェクト参照がオブジェクト インスタンスに設定されていません。説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。

例外の詳細: System.NullReferenceException: オブジェクト参照がオブジェクトのインスタンスに設定されていません。

ソース エラー: 現在の Web 要求の実行中に未処理の例外が生成されました。例外の発生元と場所に関する情報は、以下の例外スタック トレースを使用して特定できます。

スタックトレース:

[NullReferenceException: オブジェクト参照がオブジェクトのインスタンスに設定されていません。] C:\VisualStudioWorkSpace\VisualCSharpProjects\PerlsPivot\PivotServer\SectionBasedRelatedModules\SectionBasedPerlsViewer.aspx.cs:160 の PivotServer.SectionBasedRelatedModules.SectionBasedPerlsViewer.tailorConfigurationDetailsOfPageElementsToFallInLineWithTutorialSelection() .Page_Load(Object sender, EventArgs e) in C:\VisualStudioWorkSpace\VisualCSharpProjects\PerlsPivot\PivotServer\SectionBasedRelatedModules\SectionBasedPerlsViewer.aspx.cs:146 System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +24 System.Web.UI.Control.LoadRecursive() +70 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,ブール値 includeStagesAfterAsyncPoint) +3063

バージョン情報: Microsoft .NET Framework バージョン:4.0.30319; ASP.NET バージョン:4.0.30319.272

次のコードを含む160行目を確認しました。

String coursename = HttpContext.Current.Session["courseNameAssociatedWithLoggedInUser"].ToString();

明らかに、これは HttpContext.Current.Session に変数 "courseNameAssociatedWithLoggedInUser" の値がないことを示しています。

ただし、別のコンピューターで同じ手順を実行しましたが、すべてスムーズに実行されました。また、ユーザーがログインするとすぐに HttpContext.Current.Session["courseNameAssociatedWithLoggedInUser"] に値を与えていると確信しています。

HttpContext.Current.Session["courseNameAssociatedWithLoggedInUser"] は何らかの理由で破損していますか? もしそうなら、なぜ、そしてどのようにそれを防ぐのですか?

HttpContext.Current.Session の代わりに Page.Session を使用する必要がありますか? それは役に立ちますか?

4

3 に答える 3

3

「明らかに、これは HttpContext.Current.Session に変数 "courseNameAssociatedWithLoggedInUser" の値がないことを示しています。」

正確ではありません...あなたのコードを考えると...

String coursename = HttpContext.Current.Session["courseNameAssociatedWithLoggedInUser"].ToString();

... 次の項目が原因である可能性があります

  • HttpContext - 可能性は低い
  • HttpContext.Current - 思ったよりも頻繁に発生しますが、再現可能です
  • HttpContext.Current.Session["courseNameAssociatedWithLoggedInUser"]

そのチェーン内の特定のアイテムを見つけるには、次のようなことを行うことができます (疑似コード)

function string GetCourseNameThingie()
{
  if HttpContext is null
    throw new Exception("HttpContext is null")
  if HttpContext.Current is null
    throw new Exception("HttpContext.Current is null")
  if HttpContext.Current.Session["courseNameAssociatedWithLoggedInUser"] is null
    throw new Exception("HttpContext.Current.Session["courseNameAssociatedWithLoggedInUser"]is null")

   return HttpContext.Current.Session["courseNameAssociatedWithLoggedInUser"].ToString()
}

これにより、何が欠けているかが具体的にわかります。指摘したように、値が別のページによってクリアされているか、そのユーザーのセッションを破壊するほど深刻なエラーが発生している可能性が高くなります (Global.asax に Application_Error または Session_End ハンドラーがありますか?)。

元のステートメントを try/catch でラップすることもできます。例外が発生した場合は、まだ機能していると思われる別のセッション変数をすぐに確認してください。これにより、他の変数が正常かどうかも確実にわかります。

于 2013-03-27T17:31:56.170 に答える
1

ViewModel 内でのセッションの参照

ASP.net MVC を使用していない可能性がありますが、これは、誰かが答えを探している場合に役立ちます。

私はまったく同じ状況にありましたが、毎回 null 例外を受け取りましたが、まったく同じコードを実行していたにもかかわらず、同僚はまったく受け取りませんでした。

私たちの間違いは、ViewModel からセッション変数を参照することでした。これは明らかに悪い習慣です。ViewModel がコントローラーを介してセッション コンテンツを受け取り、それを ViewModel のプロパティとして設定するように、コードが変更されました。セッション データ (私の例では ProcessingWeek と呼ばれます) は this.ProcessingWeek を使用し、httpcontext.current.session["ProcessingWeek"] を直接参照しません。

EventMatchResult Match = new EventMatchResult(
      (ImportedEventModel)SessionData.ImportedEventModel,
      ref db,
      SessionData.ProcessingWeek);

...

public EventMatchResult(ImportedEventModel Event, ref CFModel db, 
                                                   int ProcessingWeek)
    {
        this.db = db;
        this.MatchedField = new List<PlayerMatchResult>();
        this.ImportedEvent = Event;
        this.ProcessingWeek = ProcessingWeek;
    }
于 2014-10-03T13:56:37.283 に答える
1

まず、英語の文法について申し訳ありません。

私は .net アプリケーションで同様の問題を抱えていましたが、その理由はアイドル時間の期限切れでした。

有効期限の設定は「(はい4)」の4つと、アプリケーションプールのリサイクル処理です。私は次のことをしました

A) アプリケーション プールから: 詳細設定を開き、「アイドル タイムアウト」を変更します。デフォルトは 20 分です。

また、「定期的な時間間隔」を 0 に設定して、リサイクルされないようにします。Microsoft がこれをデフォルトで 1740 分に設定した理由はわかりません。これはタイムアウト設定ではなく、一定期間後に常に appPool をリサイクルするための設定であるため、ユーザーが何かの最中にある場合、すべてを失うか、あなたが持っているような例外が発生します。0 に設定すると、これが無効になります。

B) 認証タイムアウト。フォーム認証などを使用している場合は、仮想ディレクトリ アプリの認証機能に移動し、[フォーム認証] を右クリックして [編集] を選択します。認証 cookie-time out を変更します。

C) ASP.NET セッション状態。ISS で、.net セッション状態機能を開き、セッション タイムアウトを変更します。また、デフォルトでは 20 分です。

D) asp.net フォーム認証のタイムアウト。これは、IIS のフォーム認証からの Cookie 時間を既に変更していたため (ステップ B)、最初は戸惑いました。そのため、デフォルトの 20 分を変更するためのタイムアウト属性を追加するために、 web.config フォーム認証タグも変更する必要があることに気付いたとき、まだいくつかの問題がありました。

私のタグは次のようになっています: ...forms name=".ASPXFORMSAUTH" path="/" loginUrl="frmLogin.aspx" timeout="1740" protection="All" ...

セッション状態のタイムアウト設定を取得する JavaScript メカニズムを開発したため、非アクティブなためにシステムが自動ログオフしようとしていることをユーザーに知らせます。

現在は問題なく動作しています。基本的に、30 分に設定したセッション状態を除いて、すべてのタイムアウト設定を「1740」分に設定しました。したがって、非アクティブの 29 分で、ユーザーがなんらかのアクティビティを行わない限り、システムは 1 分で自動的にログオフするため、アイドル時間が再び 0 から始まることをユーザーに示します。すばらしい、今ではセッションに問題はありません。

とにかく皆さん、私たちの経験と、あなたが現在抱えている同様の問題をどのように解決するかをお話ししました. ただし、ここで終了した理由は、例外が発生したときに、ローカルの開発用コンピューターで絶対パスへの参照を排除したいからです。

絶対パスが表示されている理由はわかりません。DLL アセンブリをリリース モードでコンパイルしましたが、何も変わりません。誰かにこの問題を整理してもらいますか?????

みんなありがとう

于 2013-04-02T10:40:59.077 に答える