1

我正在尝试连接到用于读取文档信息的SAP系统SAP Connector 3.0(通过我的ASP.Net MVC应用程序)。当我通过 运行应用程序时Visual studio 2012SAP logon screen启动并且我的应用程序在读取后显示数据SAP BAPI's。但是当我在同一台计算机上使用选项部署相同的应用程序Visual Studio's Publish然后运行我得到的应用程序时

 Start 'sapgui' failed.

下面是在 ASP.Net 应用程序中读取 SAP 数据的代码

var documentList =  Global.SAPRepository.CreateFunction("BAPI_DOCUMENT_CHECKOUTVIEW2");
documentList.Invoke(Global.SAPDestination);

documentList.SetValue("DOCUMENTTYPE", "TPK");
documentList.SetValue("DOCUMENTNUMBER", "2000-ABC-T01-TPK");
documentList.SetValue("DOCUMENTPART", "000");
documentList.SetValue("DOCUMENTVERSION", "A0");

var documentData = documentList.GetTable("DOCUMENTFILES");
documentList.Invoke(Global.SAPDestination);//execute query

var docNo = documentData.GetString("DOCUMENTNUMBER");
var type = documentData.GetString("DOCUMENTTYPE");
var version = documentData.GetString("DOCUMENTVERSION");

而这里是连接到 SAP Destination 的代码。

public RfcConfigParameters GetParameters(string destinationName)
    {
        RfcConfigParameters parms = new RfcConfigParameters();
        if ("Dev".Equals(destinationName))
        {
            parms.Add(RfcConfigParameters.AppServerHost, "192.168.x.xx");
            parms.Add(RfcConfigParameters.SystemNumber, "00");
            parms.Add(RfcConfigParameters.User, "myuserName");
            parms.Add(RfcConfigParameters.Password, myPassword);
            parms.Add(RfcConfigParameters.Client, "900");
            parms.Add(RfcConfigParameters.Language, "EN");
            parms.Add(RfcConfigParameters.PoolSize, "5");
            parms.Add(RfcConfigParameters.UseSAPGui, "1");
            parms.Add(RfcConfigParameters.PeakConnectionsLimit, "10");
            parms.Add(RfcConfigParameters.ConnectionIdleTimeout, "600");
        }
        return parms;
    }
4

2 回答 2

1

只需将UseSAPGui配置参数设置为“0”即可。当作为 ASP.NET 应用程序运行时,您不能使用交互式登录对话框(它是一个 Windows 对话框)。SAPGui 不会在“无人参与模式”下打开 - 也就是说,当没有用户与对话框交互时。

此处讨论了另一个问题,回调不支持:
Calling BAPI_DOCUMENT_CHECKOUTVIEW2 using SAP.Net Connector 3.0 返回“RFC Callback server not available”

解决方案似乎是设置UseSAPGui为 1 以启用回调,这是您无法做到的。所以这是一个死胡同。建议使用完全支持 RFC 的替代 BAPI,或编写不涉及回调的自定义包装器(在 ABAP 中)。

于 2017-02-13T09:38:46.013 回答
1

所以基本上事实证明,由于我的应用程序托管IISIIS作为 a 运行,Windows service并且它不允许启动将与 Desktop 交互的其他进程。由于BAPI_DOCUMENT_CHECKOUTVIEW2尝试启动SAPGUI进程,因此它会引发错误消息。

所以我实现的解决方案是我编写了一个WCF托管在托管 Windows 控制台应用程序中的服务,如下所示(VS 2012 中的简单 Windows 控制台应用程序)。

服务接口定义在这里

[ServiceContract]
public interface IMyService
{
    [OperationContract]
    string ViewDocuments();
}

服务实现类放在这里

public class MyService : IMyService
{
    public string ViewDocuments()
    {
        var documentList = Global.SAPRepository.CreateFunction("BAPI_DOCUMENT_CHECKOUTVIEW2");
        documentList.Invoke(Global.SAPDestination);

        documentList.SetValue("DOCUMENTTYPE", "TPK");
        documentList.SetValue("DOCUMENTNUMBER", "2000-Abc-T01-TPK");
        documentList.SetValue("DOCUMENTPART", "000");
        documentList.SetValue("DOCUMENTVERSION", "A0");

        var documentData = documentList.GetTable("DOCUMENTFILES");
        documentList.Invoke(Global.SAPDestination);//execute query

        var docNo= documentData.GetString("DOCUMENTNUMBER");
        var type = documentData.GetString("DOCUMENTTYPE");
        var version = documentData.GetString("DOCUMENTVERSION");
        return docNo;
    }
}

控制台应用程序的主要方法是

class Program
{
    static void Main(string[] args)
    {
        Uri baseAddress = new Uri("http://localhost:8085/hello");

        // Create the ServiceHost.
        using (ServiceHost host = new ServiceHost(typeof(MyService), baseAddress))
        {
            ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
            smb.HttpGetEnabled = true;
            smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
            host.Description.Behaviors.Add(smb);
            host.Open();

            Console.WriteLine("The service is ready at {0}", baseAddress);
            Console.WriteLine("Press <Enter> to stop the service.");
            Console.ReadLine();

            // Close the ServiceHost.
            host.Close();
        }
    }
}

我也在System.ServiceModel控制台应用程序中添加了引用。

然后我在我的 Asp.Net 应用程序中使用了这个服务,每件事都像一个魅力!

于 2017-02-13T13:11:14.083 回答