2017-02-13 6 views
1

Ich versuche, SAP System mit SAP Connector 3.0 zu verbinden, um Dokumente Informationen (über meine ASP.Net MVC Anwendung) zu lesen. Wenn ich die Anwendung über Visual studio 2012 starte, startet SAP logon screen und meine Anwendung zeigt die Daten nach dem Lesen von SAP BAPI's. Aber wenn ich die gleiche Anwendung bereitstellen mit Visual Studio'sPublish Option auf dem gleichen Computer und führen Sie die Anwendung ichstarten sapgui fehlgeschlagen beim Hosting-Anwendung in IIS

Start 'sapgui' failed. 

Unten ist der Code für das Lesen von SAP-Daten in ASP.Net Anwendung

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"); 

Während Hier ist der Code für die Verbindung zu 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; 
    } 

Antwort

1

Setzen Sie einfach den UseSAPGui Konfigurationsparameter auf "0". Sie können den interaktiven Anmeldedialog (der ein Windows-Dialogfeld ist) nicht verwenden, wenn Sie als ASP.NET-Anwendung ausgeführt werden. SAPGui wird nicht im "unbeaufsichtigten Modus" geöffnet, dh wenn kein Benutzer mit Dialogen interagieren kann.

Das andere Problem, nicht unterstützt Rückrufe, wird hier diskutiert:
Calling BAPI_DOCUMENT_CHECKOUTVIEW2 using SAP.Net Connector 3.0 returns "RFC Callback server not available"

Die Lösung scheint den Rückruf einstellen zu UseSAPGui bis 1 zu ermöglichen, die Sie nicht tun können. Das ist also eine Sackgasse. Empfehlung: Verwenden Sie ein alternatives BAPI, das vollständig RFC-fähig ist, oder schreiben Sie einen benutzerdefinierten Wrapper (in ABAP), der den Rückruf nicht enthält.

+0

Dies führt zu der Meldung 'Callbacks von ABAP werden nicht unterstützt ' – WAQ

+0

wo: am Ziel erstellen, beim Verbinden, beim Abrufen? – dlatikay

+0

'Callbacks von ABAP werden nicht unterstützt' kommt beim Aufruf von 'documentList.Invoke (Global.SAPDestination);' – WAQ

1

Also im Grunde stellt sich heraus, dass, da meine Anwendung gehostet wird in IIS und IIS läuft als Windows service und es nicht erlaubt, andere Prozesse zu starten, die mit Desktop interagieren. Seit BAPI_DOCUMENT_CHECKOUTVIEW2 versucht, SAPGUI Prozess zu starten, daher wird eine Fehlermeldung ausgegeben.

Also die Lösung, die ich implementiert habe, ist, dass ich einen WCF-Dienst geschrieben habe, den ich in einer verwalteten Windows-Konsolenanwendung wie unten gehostet (einfache Windows-Konsolenanwendung in VS 2012).

Service Interface Definition geht hier

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

Service-Implementierungsklasse geht hier

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

und das Hauptverfahren der Konsolenanwendung ist

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

ich Bezug auf System.ServiceModel hinzugefügt haben auch in der Konsolenanwendung.

Dann habe ich diesen Service in meiner Asp.Net-Anwendung verbraucht, alles funktionierte wie ein Zauber !!!

+0

Hallo, kann ich dich fragen, wo du die Konfiguration UseSapGui = 1 in diesen Dienst legst, oder wenn du sie nicht verwendest wie das funktioniert wenn Callback nicht ohne unterstützt wird UseSapGui aktiviert? –

Verwandte Themen