2009-10-13 2 views
20

오늘은 내부 직원이 일부 제품 정보를 수정할 수있는 작은 asp.net 베타 웹 응용 프로그램을 발표했습니다. 각 직원이 완전히 다른 행 (제품)을 편집하고 있었지만 사용자가 제품 정보를 서로 덮어 쓰는 문제가 발생했습니다. 에 따라, 그래서ASP.NET C# 정적 변수는 전역 변수입니까?

// EditProductGroup.aspx.cs 
public partial class EditProductGroup : System.Web.UI.Page 
{ 

    private static int _groupId = 0; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     _groupId = Convert.ToInt16(Request.QueryString["GroupID"]); 

    // get existing ProductGroup information from database using 
    //_groupId to find the row and populate textboxes 
    } 

    private void saveProductGroupData() 
    { 
     // when user hits 'save changes' button, update row 
     //where the primary key column 'ProductGroupID' matches _groupId in the table 
    } 
} 

: 구글에 대한 몇 가지 검색 후

, 나는 내가 정적 변수의 사용과 관련, 무슨 일이 일어나고 있는지 알고 있다고 생각 아래 빠른 거친 문제의 예입니다 내 연구에 따르면 정적 변수는 실제로 응용 프로그램 전체에 실제로 존재합니다. 즉, 여러 사용자가 응용 프로그램을 사용하는 경우 실제로 '_groupId'에 대해 동일한 '값'을 읽는 경우가 있고 어떤 경우에는 실제로 다른 변수 값을 사용하여 페이지의 다른 사용자의 인스턴스에서 잘못된 행 (ProductGroupId)에 데이터를 저장합니다.

내 의도는 정적 변수가 다른 사용자로부터 격리되었고 intefere하지 않아야한다는 것이 었습니다. 각 사용자는 페이지의 자체 인스턴스를 가지므로 '_groupId'변수의 자체 인스턴스가 있습니다.

운 좋게도 모두 실제 데이터베이스가 아닌 dev/staging 데이터베이스에서 발생했습니다. 나는 모든 사람이 읽고 쓰는 변수를 멈추기 위해 '정적'키워드를 버려야하는지 잘 모르겠습니다.

의견이 있으십니까? 감사합니다

답변

22

예, ASP.NET에서 정적 필드 수명은 앱 도메인에 대한 것입니다 (이 유형은 제네릭 유형에 대해 약간 다릅니다).

클라이언트 브라우저 세션의 인스턴스 (사용자 로그인)와 연결할 데이터의 저장을 위해 서버 세션을 사용하는 것이 좋습니다. 즉

Session["_groupID"] = Convert.ToInt16(Request.QueryString["GroupID"]); 

당신이 수행하여 검색 할 수 있습니다 :

short groupID = Convert.ToInt16(Session["_groupID"]); 
+0

감사합니다. 아담 .... 유일한 것은, 다른 페이지에서 사용하기 위해 이것을 저장할 필요가 없습니다. 단지 '요청'의 내용을 저장하려고합니다.QueryString [ "GroupID"] '을 해당 페이지 내의 아무 곳에서나 사용할 수있는 변수에 넣으십시오 ... 페이지의'다른 '사용자 인스턴스에 의해 변경되지 않고 ... "private _groupId"(static 키워드는 생략)가 허용됩니까? 이거? 그렇지 않다면 세션을 사용할 수 있다고 생각합니다. 의견을 보내 주셔서 감사합니다! – Dal

+1

Dal - 세션 변수는 사용자가 수동으로 만료하지 않는 한 클라이언트 브라우저 세션 전체에 대해보고있는 페이지와 상관없이 보관됩니다. ViewState를 사용하여 값을 저장할 수 있지만 클라이언트에 기본 설정으로 스트리밍되므로 스트레스가 심할 가능성이 있습니다 (가능성은 낮습니다). ViewState는 페이지 단위로 값을 유지합니다. 처음에 사용하는 QueryString 값을 계속 사용할 수없는 이유가 있습니까? 귀하의 상황에 맞는 저장을 위해 QueryString, ViewState, HiddenField 또는 Session을 권하고 싶습니다. –

+1

빠른 답장을 보내 주셔서 감사합니다. 응용 프로그램이 querystring을 변수로 직접 푸는 대신 직접 사용하도록 수정되었으므로이 메서드 (QueryString)를 계속 사용한다고 생각합니다. static 키워드없이 원래의 구현이 여전히 작동하는지 궁금했습니다. 고마워요! :) – Dal

2

정적 변수가 그들이에서 만든 일부 잘못된 값을 얻을 경우 어떤 문제가 될 수 있도록 응용 프로그램 도메인과 동일한 수명. 응용 프로그램 논리 또는 다른. 사용자 별 데이터에는 SessionState를 사용해야합니다.

18

정적 변수가 응용 프로그램에 존재한다고 잘못 말하는 것은 잘못된 것입니다. 그들은 실제로 두 개의 서로 다른 수준

일반적인 유형의 응용 프로그램 도메인
  • 당 하나의 정적 변수가 응용 프로그램 도메인
  • 당 일반적인 인스턴스 당 하나의

    응용 프로그램 할 수있다이다 제네릭이 아닌 유형의

    1. 에 존재 많은 AppDomains를 포함하며 여러 유형의 응용 프로그램에 해당됩니다.

      사용자 지정 설정을 저장하려는 경우 세션 변수를 사용하십시오.

    관련 문제