我正在尝试使用SAP
连接到SAP Connector 3.0
系统来阅读文档信息(通过我的ASP.Net MVC
应用程序)。当我通过Visual studio 2012
运行应用程序时,SAP 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;
}
答案 0 :(得分: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中)。
答案 1 :(得分:1)
基本上,事实证明,由于我的应用程序托管在IIS
中,而IIS
正在作为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;
}
}
Console应用程序的Main方法是
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应用程序中使用了这项服务,每件事都像魅力一样!