1

各リクエストを更新するグローバル データ コンテキストがあります。

    protected void Page_Load(object sender, EventArgs e)
    {

        Response.ContentType = "application/json";
        Response.Write(GetResponse());
        Response.End();
    }


    public string GetResponse()
    {
        string fileName = this.Page.Request.PathInfo;
        fileName = fileName.Remove(0, fileName.LastIndexOf("/") + 1);

        DataContext.Renew();
        MethodInfo method = this.GetType().GetMethod(fileName);
        if (method == null)
            throw new InvalidOperationException(
                string.Format("Unknown method {0}.", fileName));
        return (string)method.Invoke(this, new object[0]);
    }

しかし、何らかの理由で、複数のリクエスト (複数の ajax 呼び出しなど) を取得すると、次のようなエラーが発生することがよくあります。

   at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
   at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
   at System.Data.Linq.DataContext.GetTable(MetaTable metaTable)
   at System.Data.Linq.DataContext.GetTable[TEntity]()
   at LibKezberProjectManager.KezberPMDBDataContext.get_Cases() in c:\Users\jlarouche\Documents\Visual Studio 2012\Projects\KezberProjectManager\LibKezberProjectManager\KezberPMDB.designer.cs:line 204
   at LibKezberProjectManager.Data.Cases.GetAllScheduled() in c:\Users\jlarouche\Documents\Visual Studio 2012\Projects\KezberProjectManager\LibKezberProjectManager\Data.cs:line 113
   at LibKezberProjectManager.Logic.ScheduleManager.GetScheduledCases() in c:\Users\jlarouche\Documents\Visual Studio 2012\Projects\KezberProjectManager\LibKezberProjectManager\Logic.cs:line 1035
   at KezberProjectManager.CalendarServices.GetDates() in c:\Users\jlarouche\Documents\Visual Studio 2012\Projects\KezberProjectManager\KezberProjectManager\CalendarServices.aspx.cs:line 628

ただし、リクエストごとにコンテキストを更新しますが、そのリクエストにのみ使用されます。私は何か間違ったことをしていますか?

DataContext.Renew() は db = new KezDBContext(); を呼び出します。

そして、すべての呼び出しがこれを使用します。

すべてのアクセサ メソッドが静的であるという事実が問題になる可能性はありますか? 私はそうは思わないでしょう。

ありがとう

4

1 に答える 1

3

DataContextのコードを提供していませんが、静的フィールド/プロパティとして宣言されていると思います。これは、DataContextがスレッドセーフではないという点で非常に問題ですが、ASP.NETの各同時要求は別々のスレッドで処理されます。リクエストごとにDataContextを作成する必要があります。これはさまざまな方法で実現できます。最も簡単な(ただし、必ずしも最も保守しやすいとは限りません)のは、System.Web.UI.Pageから派生した基本クラスを作成して、DataContextをPageオブジェクトに関連付けることです。このクラスから、すべてのページが順番に作成されます。派生。

于 2013-03-13T19:30:58.980 に答える