2011-11-07 37 views
2

Visual Studioで美しく実行されるASP.Netアプリケーション(.Net 4、C#、Webフォーム、プロダクションSQLボックスを指します)同じWindows 7ボックスでホストされているIISサーバーにロードされると、2番目のセッション変数のロードを拒否します。 VSデバッグでは、アプリケーションにログインしている人物の名前が表示され、通常はActive Directoryから取得されますが、ログインする別のADユーザーにオプションを提供します。 (ASP.Netのログインコントロールを使用することは実際には実現可能ではありません。)IIS 7.5はASP.Netで1つのセッション変数を取得しますが、2番目にはありません

問題はプロダクションサーバーではデバッグできませんが、Visual Studioで動作するため、デバッグでは何も表示されません。 IISまたはweb.configで何を変更する必要があるかについての考えはありますか?私はコードの背後にあるインポートを含めました。

私の知恵の終わりでは、これはあまり安全でなく、Amazon.comのリンクのように見えますが、これは良いもののクエリ文字列に戻る準備ができています。助けて。

トムHottle

using System; 
using System.IO; 
using System.Net; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Data; 
using System.Data.SqlClient; 
using System.DirectoryServices; 
using System.Configuration; 


namespace ITIncidentMgt 
{ 
    public partial class _Default : System.Web.UI.Page 
    { 
     private SqlConnection conn; 
     private string dbConnect = 
    ConfigurationManager.ConnectionStrings["AssetMgtString"].ConnectionString; 
    private string SQL; 
    private string sErr; 
    private string hello; 
    private string user_name; 
    private int userID; 
    private string user; 
    private string field; 
    private string val; 
    private string add; 
    private string wHere = " WHERE "; 


    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      user_name = Environment.UserName; 
      if (DAC.OpenSqlConnection(ref conn, dbConnect, out sErr)) 
      { 
       if (Session["u"] == null) 
       { 

        SQL = "SELECT * FROM Users WHERE Username = '" + user_name + "'"; 
        SqlCommand cmd = new SqlCommand(SQL, conn); 
        SqlDataReader dr = cmd.ExecuteReader(); 
        while (dr.Read()) 
        { 
         userID = Convert.ToInt32(dr["UserID"]); 
         user = dr["DisplayName"].ToString(); 
        } 
        dr.Dispose(); 
        cmd.Dispose(); 
        Session["u"] = userID; 
        Session["n"] = user; 
       } 
       else 
       { 
        userID = Convert.ToInt32(Session["u"]); 
        user = Session["n"].ToString(); 
       } 
       hello = "Welcome, " + user + "."; 
       lblHello.Text = hello; 
+0

セッション["u"]が - > not null < - の場合、セッション["n"]は決して設定されないため、 "user"は設定されません。 – kd7

答えて

0

何KD7は述べています。 asp.net login &ログアウトを使用していないため、Session ["u"]はログイン後永遠にnot-nullとしてstatyになります。 カスタムログインに必要なカスタムログアウト機能は、 のようになります。protected void OnLogoutButton_Click(オブジェクト送信者、EventArgs e) { session ["u"] = null; セッション["n"] = null; } IISサーバーのセッションセッションが20分に設定されている場合、20分後に「自動ログアウト」が発生するはずです。

+0

(申し訳ありませんがkd7のコメントは見られませんでした)元の説明に追加する必要があります。 Session ["u"]を設定できる唯一の方法は、セッション["n"]を呼び出すプロセスを経由する場合です。 Session ["u"]がnullになる唯一の方法は、ユーザーが初めてログインした場合です。 "Else"は、セッション中にコードの最初のブロックが既に実行されていることを前提とします。 VSで発生しないIISサーバー上で何が起きるのかは、いずれのブロックも何らかの理由で "n"が表示されず、 "u"のみが表示されます。ラベルに「n」が表示されます。だからどちらのブロックにも設定していない。 ニースと泥、ええ? – Tom

+0

ちなみに、削除されたコメントで言ったように、セッションタイムアウトは30分に設定されています。 その間に、ローカルボックスの代わりにWin 2K8のインストールでこれを動作させることができれば、私は返信する方が便利かもしれません。 – Tom

+0

フェアポイント。さて、次の取り組み:(1)プロダクションのdr ["DisplayName"] ToString()がnullですか? (2)デバッグできない場合はログインできますか? http://support.microsoft.com/kb/307024はロギングの最小コード方法かもしれません。 EventLog.CreateEventSource(sSource、sLog)を呼び出そうとしているプロダクションのスレッドは、レジストリに書き込む権限を持っている必要があります。それ以外の場合はクラッシュします。管理者としてログインし、手動でイベントソースを作成することで最も解決されました –

0

そして、私たちはそれを打ち砕いた。問題のある行は次のとおりです。

user_name = Environment.UserName;

Visual Studioでは、誰でもコンピュータにログインしています。 IISでは、システムです。これは、UserテーブルのSystemテーブルに表示されますが、Systemには表示名がありません。表示名がないということは、あなたがnull値を引き出していることを意味します。このアプリケーションは非常に悲しいものになり、私たちすべてが楽しめる素敵なアーストーンASP.Netスクリーンの1つを投げます。

これは前にこの特定の企業で起こっていたので、解決策は別のアプリで制作されています。あるいは、誰もが手動でログインできるようにすることができます。

私はそれを見つけた方法:lblTestと呼ばれる一時ラベルを書き、lblTest.Text = user_nameをページの読み込みに設定しました。

入力いただきありがとうございます。当然のことながら、それは "私が知っているより良い"バグの一つです。

関連する問題