IIS6中的静态变量值丢失

时间:2016-03-18 15:54:59

标签: c# asp.net .net web-services

我使用.Net Framework 3.5使用C#编码的Web服务。

此Web服务的WebMethods除了主要工作负载之外还连接到Salesforce来检索和写入数据,所以我使用静态变量来保持Salesforce api登录对象在请求之间保持活动状态,这样我只登录一次(在Salesforce上),然后将此变量重新用于后续调用,从而无需登录每个请求。

在Web服务的主要代码上评估此静态对象,以检查登录对象内的某些属性是否有效(例如,会话的有效性),如果不是,则再次调用login方法。

这在我的开发环境(Windows 7和VS2012 IIS7.5?开发服务器)和测试服务器(Win Server 2003,IIS6)中完全没有问题,但它根本不起作用生产框也是带有IIS6的Windows Server 2003,因为静态变量值在每个请求上都为空,每次请求都登录Salesforce,为每个调用提供长响应时间,并且还对Salesforce施加一些限制,锁定帐户和阻止任何后续登录。

可悲的是,这两台机器(测试和生产)都没有相同的配置,而且我现在无法访问生产箱,因此目前我还不知道应用程序池的回收时间和其他细节。< / p>

我认为这是一个配置问题,但无论如何这里是我的代码,首先我只是在Webservice主类中有一个静态变量,然后(当前版本)创建一个带有静态变量的完整静态类。

以下所有代码都在同一名称空间

静态类(Salesforce登录逻辑):

public static class Srv
{
    public static SFHelpers helper = new SFHelpers(); // own class, Holds Salesforce logic and data related to this requirement
    public static SforceService SFserv = new SforceService(); // Salesforce class that handles login (and other Salesforce data manipulation methods)
    public static DateTime NextLoginSF = DateTime.MinValue; // Determines when does the Salesforce session expires

    public static void LoginSalesforce()
    { // Simplified salesforce login steps, removed try-catch and other conditions to facilitate comprehension
        SFserv.Url = helper.URLSalesforce;
        LoginResult loginResult = SFserv.login(SFuser, SFpass);
        NextLoginSF = DateTime.Now.AddSeconds(loginResult.userInfo.sessionSecondsValid);
        SFserv.Url = loginResult.serverUrl;
        SFserv.SessionHeaderValue = new SessionHeader { sessionId = loginResult.sessionId };
    }
}

主要的ctor和示例Webmethod:

[WebService(Namespace = "http://helloSO.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class WsSFTest : System.Web.Services.WebService
{
    public WsSFTest()
    {
        try
        {
            if (Srv.SFserv.SessionHeaderValue == null || DateTime.Now >= Srv.NextLoginSF) // any of this will trigger a login to renew Salesforce session
            {
                Srv.LoginSalesforce();
            }
        }
        catch (SoapException se)
        {
            if (se.Code.Name == ExceptionCode.INVALID_SESSION_ID.ToString())
            { // Login again because Salesforce invalidated my session somehow 
                Srv.LoginSalesforce();
            }
            else
            {
                // Irrelevant
            }
        }
        catch (Exception e)
        {
            // Irrelevant
        }
    }

[WebMethod]
    public SampleResult SampleMethod(int param)
    {
        try
        {
            //irrelevant code gathers values here
            var something = Srv.helper.Method(param, anotherParam);    
            return something;
        }
        catch (Exception e)
        {
            // Irrelevant
        }
    }
}

将登录对象序列化为本地文件或持久性数据库是我的最后选择,因为必须快速响应时间。

我认为我要尝试的是会话变量,但考虑到这种行为可能会发生类似的事情似乎很高。

任何线索?提前致谢

1 个答案:

答案 0 :(得分:0)

最后我在这一行中实现了一些评估价值(特别是Srv.NextLoginSF)

if (Srv.SFserv.SessionHeaderValue == null || DateTime.Now >= Srv.NextLoginSF) // any of this will trigger a login to renew Salesforce session

返回的值与预期值不同,并且静态变量没有丢失其值