【发布时间】:2016-03-18 15:54:58
【问题描述】:
我正在使用使用 .Net Framework 3.5 以 C# 编码的 Web 服务。
这个 Web 服务的 WebMethods 除了它们的主要工作负载还连接到 Salesforce 以检索和写入数据,所以我使用静态变量来保持 Salesforce api 登录对象在请求之间保持活动状态,这样我只登录一次(在Salesforce),然后将此变量重用于后续调用,避免每次请求都需要登录。
这个静态对象在Webservice的main ctor上进行求值,检查login对象内部的某些属性是否有效(比如session的有效性),如果不是,则再次调用login方法。
这在我的开发环境(Windows 7 和 VS2012 IIS7.5?开发服务器)和测试服务器(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 };
}
}
主 ctor 和示例 Web 方法:
[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
}
}
}
将登录对象序列化到本地文件或持久性数据库是我最后的选择,因为快速响应时间是必须的。
我认为留给我尝试的是 Session 变量,但考虑到这种行为,发生类似事情的可能性似乎很高。
有什么线索吗?提前致谢
【问题讨论】:
标签: c# asp.net .net web-services