2016-03-18 59 views
1

我正在使用.Net Framework 3.5在C#中编码的Web服务。静态变量值在IIS6中丢失

除了主工作负载之外,此Webservice的WebMethods还连接到Salesforce以检索和写入数据,因此我使用静态变量来保持Salesforce api登录对象在请求之间活动,这样我只登录一次在Salesforce上),然后在随后的调用中重用此变量,从而避免每次请求都需要登录。

这个静态对象在Webservice的主控制器上进行评估,以检查登录对象内部的某些属性是否有效(例如会话的有效性),如果不是,则再次调用登录方法。

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

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

我认为这是一个配置问题,但无论如何,这里是我的代码,首先我只是通过在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 }; 
    } 
} 

主要构造函数和样本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 
     } 
    } 
} 

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

我认为我还有什么需要尝试的是会话变量,但考虑到这种行为的可能性似乎可能会发生类似的情况。

任何线索?在此先感谢

回答

0

最后我在这一行(具体Srv.NextLoginSF)

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

用不同的值返回比预期实现一些评估值,以及静态变量并没有失去其价值