C# 在IIS中托管应用程序时启动sapgui失败

C# 在IIS中托管应用程序时启动sapgui失败,c#,asp.net,visual-studio-2012,sap,sap-dotnet-connector,C#,Asp.net,Visual Studio 2012,Sap,Sap Dotnet Connector,我正在尝试使用SAP Connector 3.0连接到SAP系统以读取文档信息(通过我的ASP.Net MVC应用程序)。当我通过Visual studio 2012运行应用程序时,SAP登录屏幕启动,我的应用程序在读取SAP BAPI的后显示数据。但是当我在同一台计算机上使用Visual Studio的发布选项部署同一个应用程序,然后运行我得到的应用程序时 Start 'sapgui' failed. 下面是在ASP.Net应用程序中读取SAP数据的代码 var documentList

我正在尝试使用
SAP Connector 3.0
连接到
SAP
系统以读取文档信息(通过我的
ASP.Net MVC
应用程序)。当我通过
Visual studio 2012
运行应用程序时,
SAP登录屏幕
启动,我的应用程序在读取
SAP BAPI的
后显示数据。但是当我在同一台计算机上使用Visual Studio的
发布
选项部署同一个应用程序,然后运行我得到的应用程序时

 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目标的代码

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;
    }

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

另一个问题,不支持回调,在这里讨论:


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

因此,基本上,由于我的应用程序托管在
IIS
中,
IIS
作为
Windows服务运行,它不允许启动与桌面交互的其他进程。由于
BAPI\u DOCUMENT\u 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;
    }
}
这里是服务实现类

[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();
        }
    }
}
类程序
{
静态void Main(字符串[]参数)
{
Uri baseAddress=新Uri(“http://localhost:8085/hello");
//创建ServiceHost。
使用(ServiceHost主机=新ServiceHost(typeof(MyService),baseAddress))
{
ServiceMetadataBehavior smb=新ServiceMetadataBehavior();
smb.HttpGetEnabled=true;
smb.MetadataExporter.PolicyVersion=PolicyVersion.Policy15;
host.Description.Behaviors.Add(smb);
host.Open();
WriteLine(“服务在{0}处准备就绪”,基地址);
控制台。WriteLine(“按以停止服务”);
Console.ReadLine();
//关闭ServiceHost。
host.Close();
}
}
}
我还在控制台应用程序中添加了对
System.ServiceModel
的引用


然后我在我的Asp.Net应用程序中使用了这项服务,每件事都很有魅力

这导致消息
来自ABAP的回调不受支持
其中:在创建目的地时,在连接时,在检索时?
来自ABAP的回调不受支持
在调用
documentList.Invoke(Global.SAPDestination)时出现确定这与sapgui无关。我假设当您开始使用Visual Studio时,您是以VS Development Server作为登录用户运行的,而在IIS中,您是以ApplicationPoolIdentity身份运行的?我可能会怀疑,但正如你所说,它在调试器中工作,我现在没有主意了。我明白了。那么,我恐怕没有什么比重复这篇文章说的更好的消息了:嗨,我能问一下你在这个服务中把配置UseSapGui=1放在哪里,或者如果你不使用它,如果没有启用UseSapGui就不支持回调,那么它是如何工作的?