本文介紹要如何設定 WebService 使用 ReadOnly Session的方式
最近有案子會使用到 WebService ,而且在 WebService 中會使用到 Session。
如果要在 WebMethod 中使用 Session 的話,需要設定 EnableSession=true ,如下,
[WebMethod(EnableSession=true)]
而這樣 Session 是可以 Read/Write 的,但是如果某些 WebMethod 只需要讀取 Session 值,
那應該設定為 ReadOnly 就可以了(SessionStateBehavior.ReadOnly)。
但是 WebMethod 只能設定 EnableSession=true 或是沒有 ....
如果啟用 Read/Write Session,而 concurrency Access時,就會等待 ....
ASP.NET Web Service very slow when [WebMethod(EnableSession = true)]
後來有找到「How to force an IIS hosted WCF or ASMX [webservice] to use session object readonly?」
它可以在 Application_BeginRequest 事件裡判斷,然後設定 Required 或是 ReadOnly 。
筆者建立 WebService2 會設定 Session 值, WebService1 則只讀取 Session 值。
所以我的判斷如下,
protected void Application_BeginRequest(object sender, EventArgs e)
{
if (Context.Request.Path.StartsWith("/WebService2"))
Context.SetSessionStateBehavior(SessionStateBehavior.Required);
else
Context.SetSessionStateBehavior(SessionStateBehavior.ReadOnly);
}
當然,我們也可以用 某個 目錄 裡的 WebService 都需要 Write Session 或是 ReadOnly Session 或是沒有。
以下是我的測試程式,
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[System.Web.Script.Services.ScriptService]
public class WebService1 : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld()
{
var hello = Session["Hello"].ToString();
return hello;
}
}
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[System.Web.Script.Services.ScriptService]
public class WebService2 : System.Web.Services.WebService
{
[WebMethod(EnableSession=true)]
public string HelloWorld()
{
Session["Hello"] = "Hello world!!!";
return Session["Hello"].ToString();
}
}
測試的 ASPX,需要加入 jQuery 哦!
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script src="Scripts/jquery-2.1.3.min.js"></script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="Button1" runat="server" Text="Call Set Session Value from WS2" />
<asp:Button ID="Button2" runat="server" Text="Get Session Value from WS1"/>
</div>
</form>
<script>
$(document).ready(function () {
$('#Button1').click(function () {
var strURL = 'http://localhost:60591/WebService2.asmx/HelloWorld';
$.ajax({
type: 'POST',
url: strURL,
dataType: 'xml',
success: function (oXml) {
alert($('string', oXml).text());
},
error: function (xhr, ajaxOptions, thrownError) {
alert(xhr.status);
alert(thrownError);
}
});
return false;
});
$('#Button2').click(function () {
var strURL = 'http://localhost:60591/WebService1.asmx/HelloWorld';
$.ajax({
type: 'POST',
url: strURL,
dataType: 'xml',
success: function (oXml) {
alert($('string', oXml).text());
},
error: function (xhr, ajaxOptions, thrownError) {
alert(xhr.status);
alert(thrownError);
}
});
return false;
});
})
</script>
</body>
</html>
如果大家有其他想法,也請跟我分享一下哦! 謝謝!
參考資料
ASP.NET Web Service very slow when [WebMethod(EnableSession = true)]
How to force an IIS hosted WCF or ASMX [webservice] to use session object readonly?
Readonly access to session in a web service call?
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^