[ASP.NET]設定 WebService 使用 ReadOnly Session

本文介紹要如何設定 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:從零開始的軟體開發生活

請大家繼續支持 ^_^