2009-02-26 24 views
0

ASP.NET 2.0アプリケーションの接続文字列に問題があります。 ConnectionStringプロパティが初期化されていない場合があるランダムかつ断続的に何らかの理由で発生する問題。ASP.NET接続文字列

マイ・コネクション・ストリングは実際にはWebサービスから来ています。なぜなら、さまざまな種類のユーザーに、ユーザー・レベルに応じて異なる接続文字列が用意されているからです。

私は、マスターページ(mstr.page)と後ろの対応するコード(mstr.page.vb)を持っている:私はこのように書き、これまで行ってきた何

。私のマスターページで

、私はからパブリック共有機能を使用して、つまりは今

Session("ConnString") = "RetrievedConnectionString" 

私のページのいずれかで、私たちはpage1.aspx.vbを言わせて、最初に接続文字列を取得し、セッション変数に同じを保存します(MyClass.vbという名前の)クラスを使用し、それを私のpage1.aspx.vbに使用してください。参照用

いくつかのコード:

[MyClass.vb] 
Imports System.Web 

NameSpace ClassNameSpace 
    Public Class Admin 
    Protected Shared da as New DataAccess() 

    Public Shared Function MYFunction() as String 
     'Execute some sql statements here, using the DataAccess 
     stringToReturn = Ctype(da.ExecuteScalar("SQLCommand"), String) 
     Return stringToReturn 
    End Function 
    End Class 
End NameSpace 

[DataAccessClass.vb] 
Public Class DataAccess() 
    Private m_ConStr As String = "" 

    Public Sub New() 
    m_ConStr = HttpContext.Current.Session("ConnString") 
    End Sub 

    'Some methods for SQL statement execution (ExecuteQuery, ExecuteScalar) 
End Class 

[Page1.aspx.vb] 
Imports ClassNameSpace 

Protected Sub Page_Load(....) Handles Me.Load 
    Dim strValue as String = Admin.MyFunction() 
End Sub 

私はあなたに物事が起こっているかのいくつかの大まかなアイデアを示すために、上記のコードを配置しています。

基本的には、データアクセスクラスでは接続文字列の値が失われているように見えるため、関数Admin.MyFunction()が失敗することがあります。

これはすでにかなりの間私に困っています。

私は誰かが正しい方向にこれを解決するために私を指すことができることを願っています。基本的には、Webアプリケーションを訪問している各ユーザーが取得した接続文字列を常に維持し、どこでも使用できるようにしたいと考えています。セッション変数は、ASP.NETがそのプロセスをリサイクルするときにセッションが失われるため、最適ではないようです。

ところで、私は最初にWebサービスからマスターページを介して接続文字列を取得しています。私は、条件がセッション変数が失われているが、私のアプリケーションがリサイクルプロセス中にWebサービスに接続できないと思うときに、データアクセスクラスに同じ検索機能を配置しようとしました。

アドバイスはありがとうございます。この上

更新:

私は、セッション変数を使用し、状態サーバーにモードを設定しようとしましたが、どうやら私が使用していますいくつかのDLLは、私は振り出しに戻っていますので、シリアライズすることはできません。

これを行うより良い方法はありますか?

答えて

1

あなたのセッションがクローバになっているかどうかを確認することが1つあります。 (デフォルトの)メモリ内セッションを使用している場合は、ASP.NETワーカープロセスがリサイクルされるたびにセッションが終了します。これが問題を引き起こしている場合は、IISでASP.NET SessionServerを使用するか、セッション記憶域としてSQL Serverを使用する必要があります。

+0

私は前に、接続文字列の値を取得するセッション変数をチェックします。 NullまたはNothingまたはEmptyの場合、Webサービスから接続文字列を再度取得しようとしますが、リサイクルが進行中であるためWebサービスにもアクセスできません。 – Batuta

0

これは私が経験していたのとまったく同じ問題で、接続文字列が正しく初期化できないようにセッション変数が死ぬことが判明しました。

+0

あなたはどんなソリューションをやったのですか?ありがとう。 – Batuta

+0

セッションタイムアウトを増やし、web.configでセッションモードがInProcに設定されていることを確認しました。これまでに働いたようだ。私は非常に良いASP.Netプログラマーではないので、おそらくそれを行うための良い方法です。 –

+0

また、すべてのページで接続文字列を初期化して、初期化されていないことを確認しました。 –

0

なぜあなたのアプリは1つの接続文字列しか使用できませんか?なぜ接続文字列はWebサービスを介して来る必要がありますか?プロセス全体に膨大なレイテンシを追加します。おそらくデータベース内のデータセキュリティで何かをしなければならないと思います。

にこれを行うにはがある場合は、フォールバック/デフォルトの接続文字列を使用できませんか?あなたのコードをいくつかのエラーハンドリングでセッションから取り除こうとすると、あなたのデフォルトに戻っても失敗しますか?

+0

いくつかのstup * d男は実際にこの種のソリューションを提案しましたが、実際にはWebサービスから接続文字列を取得するしかありませんでした。 接続文字列はまったく異なる複雑さを持ち、アクセスされたページに基づいて1人のユーザーが10種類の異なる接続文字列を持つことがあります。 – Batuta

+0

時には理想的な解決策は、以前に行われた悪い決定を元に戻すことです。適切な決定を適切なタイミングで行うと、プログラミング(そして人生!)は簡単です。 – dfasdljkhfaskldjhfasklhf

0

あなたのWebサービスとWebアプリケーションを異なるアプリケーションプールに配置します。次に、Webアプリケーションプールのタイムアウトの長さを長くします。

+0

WebサービスとWebアプリケーションプールはすでに別のマシンにあります。タイムアウトも増加しましたが、ASP WPがリサイクルすると、接続文字列は失われます。 – Batuta

1

私は可能な限りこのタイプのもののためのセッションの使用を制限しようとします。 Web.Configを使用して接続文字列を格納する場合は、いつでもアクセスでき、セッションのように期限切れになりません。それはアプリケーションインスタンスのすべてのユーザーに対して同じである場合は、静的データ・アクセス・クラスを持つ考えるかもしれ

...

+0

前述のとおり、各ユーザーにはWebサービスによって提供される固有の接続文字列プロパティがあります。この理由から、web.configで接続文字列をハードコーディングすることはできません。 – Batuta

+0

接続文字列にはどのような違いがありますか?あなたは標準的な接続文字列を持っていれば、あなたはいつでもユーザーのためにそれを修正し、それを離れて投げることができます... – RSolberg

+0

私はベース/標準接続文字列を持って、 – dfasdljkhfaskldjhfasklhf