4

这个问题是关于在 asp.net webforms 应用程序中使用静态修饰符我是一个初学者,虽然我从来没有遇到过这个静态“问题”的问题,但我仍然不太担心这个问题,并想解决这个问题。

最近我开始使用Ajax/jQueryPOST 而不是asp.net“正常”回发

所以我可以利用 javascript 对象并在与服务器交互时避免页面刷新

我的问题是关于 ajax 帖子。它使用静态方法 向用户返回信息

有关客户端代码的一些背景信息...(如果您愿意,可以跳到下面的服务器端)

客户端 :

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是不安全的,在这段代码中它是否不安全?

4

1 回答 1

6

将您的方法作为静态方法运行是安全的,只要它不依赖于静态方法之外的静态变量。

这是一个如何在 asp.net Web 应用程序中不使用静态的示例:

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

首先将 SaveSomething 字符串属性设置为您的值。同时,该属性可以由另一个请求/用户设置,因为它共享该属性。现在,如果您调用该属性并将其用于 AnotherAction,它可能与您最初设置的值不同。如果要使用对外部静态变量的引用,则必须确保以这种方式使用这些变量是安全的。大多数情况下它们是只读的。

但是,可以使用 lock 语句锁定属性:

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

lock 关键字通过获取给定对象的互斥锁、执行语句然后释放锁来将语句块标记为临界区。

于 2013-07-20T15:19:34.760 回答