Asp.net 同时使用多个SAP用户连接到RFC目标
我有一个.Net应用程序,用于通过它创建SAP销售订单。当我使用一个(通用)单一SAP用户id登录到RFCDestation时,它工作得非常好。但它不适用于具有不同用户id的并发登录。我看到两种情况: 1) 当我使用用户id(比如test1(SAP用户))登录时,它会成功连接 2) 当我使用不同的用户和不正确的密码登录时,它仍然连接 我不想注销test1会话,因为我希望同时进行并发登录。我如何做到这一点。下面是我迄今为止尝试过的代码Asp.net 同时使用多个SAP用户连接到RFC目标,asp.net,authentication,saprfc,sap-dotnet-connector,Asp.net,Authentication,Saprfc,Sap Dotnet Connector,我有一个.Net应用程序,用于通过它创建SAP销售订单。当我使用一个(通用)单一SAP用户id登录到RFCDestation时,它工作得非常好。但它不适用于具有不同用户id的并发登录。我看到两种情况: 1) 当我使用用户id(比如test1(SAP用户))登录时,它会成功连接 2) 当我使用不同的用户和不正确的密码登录时,它仍然连接 我不想注销test1会话,因为我希望同时进行并发登录。我如何做到这一点。下面是我迄今为止尝试过的代码 SAPConnection objDestConfig =
SAPConnection objDestConfig = new SAPConnection();
objDestConfig.AddOrEditDestination(appserver, Name, instanceno, systemid, txt_user.Text,
txt_password.Text, client, "E");
RfcDestination prd = RfcDestinationManager.TryGetDestination(Name);
if (prd == null)
{
RfcDestinationManager.RegisterDestinationConfiguration(objDestConfig);
prd = RfcDestinationManager.GetDestination(Name);
}
// }
//Establishing connection with SAP system
// RfcDestination dest = RfcDestinationManager.GetDestination(Name);
prd.Ping(); //always returns true even for incorrect password if the destination is registered.
public SAPConnection()
{
//check for available SAP destinations
availableDestinations = new Dictionary<string, RfcConfigParameters>();
}
public RfcConfigParameters GetParameters(string destinationName)
{
//reading current SAP destination configurations
RfcConfigParameters foundDestination;
availableDestinations.TryGetValue(destinationName, out foundDestination);
return foundDestination;
}
public bool ChangeEventsSupported()
{
return true;
}
public event RfcDestinationManager.ConfigurationChangeHandler ConfigurationChanged
{
add
{
changeHandler = value;
}
remove
{
}
}
//removes the destination that is known under the given name
public void RemoveDestination(string name)
{
if (name != null && availableDestinations.Remove(name))
{
changeHandler(name, new RfcConfigurationEventArgs(RfcConfigParameters.EventType.DELETED));
}
}
//allows adding or modifying a SAP destination for a specific application server
public void AddOrEditDestination(string appserver, string name, string systemnumber, string systemid, string user, string password, string client, string language)
{
RfcConfigParameters parameters = new RfcConfigParameters();
parameters[RfcConfigParameters.Name] = name;
parameters[RfcConfigParameters.User] = user;
parameters[RfcConfigParameters.Password] = password;
parameters[RfcConfigParameters.Client] = client;
parameters[RfcConfigParameters.Language] = language;
parameters[RfcConfigParameters.AppServerHost] = appserver;
parameters[RfcConfigParameters.SystemNumber] = systemnumber;
parameters[RfcConfigParameters.SystemID] = systemid;
RfcConfigParameters existingConfiguration;
if (availableDestinations.TryGetValue(name, out existingConfiguration))
{
//modifying SAP destination
//if a destination of that name existed before, we need to fire a change event
availableDestinations[name] = parameters;
RfcConfigurationEventArgs eventArgs = new RfcConfigurationEventArgs(RfcConfigParameters.EventType.CHANGED, parameters);
changeHandler(name, eventArgs);
}
else
{
//adding new SAP destination
availableDestinations[name] = parameters;
}
SAPConnection objDestConfig=new SAPConnection();
objDestConfig.AddOrEditDestination(appserver、Name、instanceno、systemid、txt_user.Text、,
txt_password.Text,客户端,“E”);
RfcDestination prd=RfcDestinationManager.TryGetDestination(名称);
如果(prd==null)
{
RfcDestinationManager.RegisterDestinationConfiguration(ObjDestinationConfig);
prd=rfcdestationmanager.GetDestination(名称);
}
// }
//建立与SAP系统的连接
//RfcDestination dest=RfcDestinationManager.GetDestination(名称);
珠三角平(//如果目标已注册,即使密码不正确,也始终返回true。
公共连接()
{
//检查可用的SAP目标
availableDestinations=新字典();
}
公共RfcConfigParameters GetParameters(字符串destinationName)
{
//读取当前SAP目标配置
RfcConfigParameters找到目的地;
availableDestinations.TryGetValue(destinationName,OutFoundDestination);
返回目的地;
}
公共布尔更改事件支持()
{
返回true;
}
公共事件RfcDestinationManager.ConfigurationChangeHandler ConfigurationChanged
{
添加
{
changeHandler=值;
}
去除
{
}
}
//删除给定名称下已知的目标
公共void RemoveDestination(字符串名称)
{
if(name!=null&&availableDestinations.Remove(name))
{
changeHandler(名称,新的RfcConfigurationEventArgs(RfcConfigParameters.EventType.DELETED));
}
}
//允许添加或修改特定应用程序服务器的SAP目标
public void AddOrEditDestination(字符串appserver、字符串名称、字符串systemnumber、字符串systemid、字符串用户、字符串密码、字符串客户端、字符串语言)
{
RfcConfigParameters parameters=新的RfcConfigParameters();
参数[RfcConfigParameters.Name]=名称;
参数[RFCConfigpParameters.User]=用户;
参数[RFCConfigpParameters.Password]=密码;
参数[RFCConfigpParameters.Client]=客户端;
参数[RfcConfigParameters.Language]=语言;
参数[RFCConfigpParameters.AppServerHost]=appserver;
参数[RfcConfigParameters.SystemNumber]=系统编号;
参数[RfcConfigParameters.SystemID]=SystemID;
RfcConfigParameters现有配置;
if(availableDestinations.TryGetValue(名称,out existingConfiguration))
{
//修改SAP目标
//如果以前存在该名称的目的地,我们需要触发一个更改事件
availableDestinations[名称]=参数;
RfcConfigurationEventArgs eventArgs=新的RfcConfigurationEventArgs(RfcConfigParameters.EventType.CHANGED,parameters);
changeHandler(名称、事件参数);
}
其他的
{
//添加新的SAP目标
availableDestinations[名称]=参数;
}
这是RfcCustomDestination的一个用例。创建一个仅包含AppServerHost、SystemNumber等参数的RFCD目的地,但不包含用户、密码、客户端和语言。这可以被视为“基本目的地”
然后,对于每个登录到您的应用程序的最终用户,从“基本目标”创建一个新的RfcCustomDestination对象,您可以在其中混合当前用户的特殊参数user、Password、Client和Language。(您可能通过提示某种“登录对话框”从最终用户处获得这些参数)对他来说。这是一个RfcCustomDestination的用例。创建一个只包含AppServerHost、SystemNumber等参数的RFC destination,但不包含用户、密码、客户端和语言。这可以被视为“基本目的地”
然后,对于每个登录到您的应用程序的最终用户,从“基本目标”创建一个新的RfcCustomDestination对象,您可以在其中混合当前用户的特殊参数user、Password、Client和Language。(您可能通过提示某种“登录对话框”从最终用户处获得这些参数)给他。NCo可能使用它已经拥有的连接。如果它具有相同的名称,NCo可能无法识别更改的用户名和密码。您可能需要向DestinationManager注册一组目的地,并实施手动池,在向我们查找目的地时考虑用户名e、 我为每个用户使用了不同的名称。但密码和登录都不正确。我通过使用检查并发用户名和密码的RfcustomDestination类解决了此问题。RfcDestination dest=RfcDestinationManager.GetDestination(“SAPConnection”);RfcCustomDestination temp=dest.CreateCustomDestination();temp.User=txt_User.Text;temp.Password=txt_Password.Text;如果密码错误