2013-07-20 42 views
4

這個問題是關於在一個asp.net webforms應用程序中使用靜態修改器 我是一個begginer,雖然我從來沒有遇到過這個靜態「問題」的問題 我仍然我很少擔心這個問題,並想澄清這一點。靜態網頁方法 - 用戶之間共享價值的風險

最近我一直在使用,而不是asp.net「正常」回傳Ajax/jQuery POST

所以我可以把JavaScript對象的優勢,也避免了頁面刷新與服務器進行交互時

我的問題是關於AJAX後開始。它使用的是靜態方法 信息返回給用戶

對客戶端代碼的一些背景資料...(你可以跳過服務器端下面如果u喜歡)

客戶端:

HTML

<td id="TD_Actions_<%=RecordIdSlot%>" class="RepTblDataTds "> 
    <!-- will be used to trigger jquery function instead of asp imageButton that causes a postback 
    <span id="SpanEditRecord"> 
     <img src="img/EditPic.png" style="width:20px;" class="CssClassImgBut_Edit" /> 
    </span> 
</td> 

的jQuery:

var SpanEditRecord = $('#SpanEditRecord'); // the trigger span 
// onclick event post data to code behind 
SpanEditRecord.click(function() { 

    var Recid = $(this).parent().attr('id').split('_')[2];// takes the Sql table RecordiD 
    var data = []; 
    data.push({ key: 'RecordId', value: parseInt(Recid) }); //usually there's more data in "data" 

    var targetUrl = "default.aspx/EditKkRecord"; 

    $.ajax({ 
     type: 'POST', 
     url: targetUrl, 
     data: JSON.stringify({ SentPars: data }), 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 

     success: function (response) { 
         getResponseFromEditRequest(response.d); 
     }, 
     error: function (response) { 
      alert(response.status + ' ' + response.statusText); 

     } 
    }); 


}); 

//handle callback /response from C# server side code 
function getResponseFromEditRequest(htmlret) { 
    var packagerec = htmlret.split(','); 
     ........ 
     ........ 
} 

,現在所討論的話題..

C#服務器端

這部分所討論的問題, 是[WebMethod]是不安全的,使用時和幾個用戶? 它可能意外地共享相同的返回值,因爲它是一個靜態方法?

[WebMethod] 
    public static string EditKkRecord(object SentPars) 
    { 
     Dictionary<string, string> NwDataDict = new Dictionary<string, string>(); 

      string tmpSQLstr = ""; 
      try 
      { 

       Array aa = (Array)SentPars; 


       foreach (Dictionary<string, object> pair in aa) 
       { 
        NwDataDict.Add((string)pair["key"], pair["value"].ToString()); 
       } 


      } 
      catch (Exception ex) 
      { 
       return ex.Message; 
      } 

      if (NwDataDict.Count > 0) 
       return EditRecordFromtblKupaKtanaDb(NwDataDict); 
      return tmpSQLstr; 
     } 

    static string EditRecordFromtblKupaKtanaDb(Dictionary<string, string> todayKupa) 
    { 
     interact with database; 
     return "comaSeparated - columns values as a string"; 
    } 

所以可以將它在這種情況下發生的用戶A,B和C,會觸發Web方法和共享相同的返回值,如果說他們所有的嘗試和編輯同「的recordId」

或者更糟的是(我能想到),如果他們都編輯不同的記錄,實際上可以從第一個用戶共享行動...相同的記錄..

什麼時候它實際上是不安全的使用static並且它是不安全的這個代碼?

回答

6

將方法作爲靜態方法運行是安全的,只要它不依賴於靜態方法之外的靜態變量。

這裏怎麼沒有在asp.net web應用程序使用一個靜態例如:

public static string SaveSomething; 
    public static void DoSomething() 
    { 
     SaveSomething = "something"; 
     //... do more code 
     AnotherAction(SaveSomething); 
    } 

首先SaveSomething字符串屬性設置爲你的價值。與此同時,此屬性可以由另一個請求/用戶設置,因爲它共享該屬性。現在,如果您回想此屬性並將其用於AnotherAction,它可能與您最初設置的值不同。如果你想使用對外部靜態變量的引用,你必須確保這些變量可以安全地以這種方式使用。大多數情況下,它們是隻讀的。

然而,它可以鎖定與鎖語句中,屬性:

public static string SaveSomething; 
    public static void DoSomething() 
    { 
     lock (SaveSomething) 
     { 
      SaveSomething = "something"; 
      //... do more code 
      AnotherAction(SaveSomething); 
     } 
    } 

The lock keyword marks a statement block as a critical section by obtaining the mutual-exclusion lock for a given object, executing a statement, and then releasing the lock.

+0

你可以舉一個例子來怎麼會是安全的全局變量使用它呢?比如如何傳遞一些其他的程序返回值,或者如果很難想象它,你能否提供一個錯誤的使用變量的示例代碼,這些變量超出了webmethod範圍,舉一個例子vs正確的用法(正確的不被共享) –

+0

查看更新的答案 –