2017-02-13 118 views
1

我试图使用SAP Connector 3.0连接到SAP系统来读取文档信息(通过我的ASP.Net MVC应用程序)。当我通过Visual studio 2012运行应用程序时,SAP logon screen启动,我的应用程序在从SAP BAPI's读取后显示数据。但是,当我使用部署在同一台计算机上Visual Studio'sPublish选项相同的应用程序,然后运行该应用程序我得到在IIS中托管应用程序时启动sapgui失败

Start 'sapgui' failed. 

下面是代码在ASP.Net应用程序

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数据这里是连接到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; 
    } 

回答

1

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

,回调不支持,另一个问题是在这里讨论:
Calling BAPI_DOCUMENT_CHECKOUTVIEW2 using SAP.Net Connector 3.0 returns "RFC Callback server not available"

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

+0

这导致消息“不支持来自ABAP的回调” – WAQ

+0

其中:在创建目的地,连接,检索? – dlatikay

+0

当调用'documentList.Invoke(Global.SAPDestination);' – WAQ

1

基本上,事实证明,由于我的应用程序托管在IISIIS作为Windows service运行,并且它不允许启动其他将与桌面交互的进程。由于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应用程序中使用了这个服务,每件事都像魅力一样工作!

+0

嗨,我可以问你在哪里你把配置UseSapGui = 1在这个服务,或者如果你不使用它如何工作,如果回调不支持没有没有UseSapGui已启用? –