Rov*_*ord 4 c# asp.net jquery static webforms
这个问题是关于在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>
Run Code Online (Sandbox Code Playgroud)
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(',');
........
........
}
Run Code Online (Sandbox Code Playgroud)
现在谈到有问题的话题..
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";
}
Run Code Online (Sandbox Code Playgroud)
所以在这种情况下,用户a,b和c会触发该Web方法并共享相同的返回值,如果他们都尝试编辑相同的"RecordId"
甚至更糟(我能想到),如果他们都编辑不同的记录,实际上行动可以从第一个用户共享...相同的记录..
什么时候使用它实际上是不安全的static并且在这段代码中是否不安全?
将方法作为静态运行是安全的,只要它不依赖于静态方法之外的静态变量即可.
这里是一个如何在asp.net Web应用程序中不使用静态的示例:
public static string SaveSomething;
public static void DoSomething()
{
SaveSomething = "something";
//... do more code
AnotherAction(SaveSomething);
}
Run Code Online (Sandbox Code Playgroud)
首先,SaveSomething字符串属性设置为您的值.同时,该属性可以由另一个请求/用户设置,因为它共享该属性.现在,如果您回忆该属性并将其用于AnotherAction,则它可能与您最初设置的值不同.如果要使用对外部静态变量的引用,则必须确保这些变量以这种方式安全使用.大多数情况下它们是只读的.
但是可以使用lock语句锁定属性:
public static string SaveSomething;
public static void DoSomething()
{
lock (SaveSomething)
{
SaveSomething = "something";
//... do more code
AnotherAction(SaveSomething);
}
}
Run Code Online (Sandbox Code Playgroud)
lock关键字通过获取给定对象的互斥锁,执行语句,然后释放锁来将语句块标记为关键部分.
| 归档时间: |
|
| 查看次数: |
2500 次 |
| 最近记录: |