Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 同时使用多个SAP用户连接到RFC目标_Asp.net_Authentication_Saprfc_Sap Dotnet Connector - Fatal编程技术网

Asp.net 同时使用多个SAP用户连接到RFC目标

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 =

我有一个.Net应用程序,用于通过它创建SAP销售订单。当我使用一个(通用)单一SAP用户id登录到RFCDestation时,它工作得非常好。但它不适用于具有不同用户id的并发登录。我看到两种情况:

1) 当我使用用户id(比如test1(SAP用户))登录时,它会成功连接

2) 当我使用不同的用户和不正确的密码登录时,它仍然连接

我不想注销test1会话,因为我希望同时进行并发登录。我如何做到这一点。下面是我迄今为止尝试过的代码

 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;如果密码错误