Laden...

[gelöst] XML Probleme mit WebVerweis und DienstVerweis lösen. VS08 zu SAP verbinden

Erstellt von nikg vor 14 Jahren Letzter Beitrag vor 14 Jahren 6.281 Views
N
nikg Themenstarter:in
10 Beiträge seit 2009
vor 14 Jahren
[gelöst] XML Probleme mit WebVerweis und DienstVerweis lösen. VS08 zu SAP verbinden

Hallo,
ich bin leider ein Neuling in Sachen VS und C#.
Ich versuche gerade mittels C# über VS2008 zu SAP CRM 7.0 eine Verbindung aufzubauen.
Auf der SAP CRM Seite ist alles eingerichtet, jedoch bereitet mir das Visual Studio 2008 Probleme.
Was ich mache ist folgendes:
Ich versuche mit dieser Anleitung (für VS05) eine simple Verbindung zu SAP herzustellen.

Hier wird nur Teil1 der Anleitung verwendet Seite 14 - 15 und Seite 22 (dort C#-Code)

Es scheitert an Visual Studio 08. Denn ich muss dort, laut Anleitung, eine Web Referenz ins Projekt einbinden. Hier der Link für das entgsprechende XML-File, welches eingebaut werden muss.
Ich habe die XML auf meinen Webspace hochgeladen, so dass man sich in VS beim Aufruf der XMl nicht anmelden muss.

Wenn ich so, wie in der Anleitung nur eine Webreferenz einbinde, dann gibt es hier Fehler:


int P1 = 2;
int result = 0;
CookieContainer cookie = new CookieContainer();
zwsd_srt_tests_fb_sum.zwsd_srt_tests_fb_sumService _proxy1 = new Call_zwsd_srt_tests_fb_sum.zwsd_srt_tests_fb_sum.zwsd_srt_tests_fb_sumService(); // zwsd_srt_tests_fb_sumService WIRD NICHT ERKANNT
_proxy1.Credentials = new NetworkCredential("myuser", "secret pwd");

wenn ich nur den Dienstverweis nehme, dann kennt VS die namespaces
using System.Web.Services.Protocols;
using System.Web.Services;

nicht mehr

Wenn ich beide einbaue, gibts es irgendwie alles Doppelt. (dabei heissen meine beiden Verweise gleich, sonst gibt es wieder Fehler)

Es wäre schön wenn mir jemand helfen könnte, denn die Ergebnisse müssen sehr schnell her. Im Gegenzug poste ich hier die komplette Anleitung (auch mit SAP-Seite), denn diese gibt es für VS08 und CRM 7.0 nicht! Es gibt nur veraltete Infos, die nicht wirklich weiter helfen, da sich in CRM 7.0 EINIGES verändert hat.

Danke
nikg

N
nikg Themenstarter:in
10 Beiträge seit 2009
vor 14 Jahren

Hallo,
ich habe das komplette Projekt als ZIP-File hochgeladen. Es ist nicht viel Quellcode. Vielleicht findet jemand Zeit, um sich anzuschauen. Es ist bestimmt ETWAS GANZ SIMPLES. Für alle Tipps wäre ich dankbar.

Zusätzlich schreibe ich den Code hier:


using System;
using System.Net;
using System.Collections.Generic;
using System.Text;
using System.Web.Services.Protocols;
using System.Web.Services;
namespace Call_zwsd_srt_tests_fb_sum
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                //Sample Project for calling WS in SAP and writing data
                int P1 = 2;
                int result = 0;
                CookieContainer cookie = new CookieContainer();
                // zwsd_srt_tests_fb_sum = Das ist mein Webservice. Die Datei selbst heisst eigentlich document.xml
                zwsd_srt_tests_fb_sum.zwsd_srt_tests_fb_sumService _proxy1 = new Call_zwsd_srt_tests_fb_sum.zwsd_srt_tests_fb_sum.zwsd_srt_tests_fb_sumService();
                _proxy1.Credentials = new NetworkCredential("myuser", "secret pwd");
                _proxy1.CookieContainer = cookie;
                result = _proxy1.SrtTestsFbSum(P1, true);
                Console.WriteLine(result);
                cookie = _proxy1.CookieContainer;
                zwsd_srt_tests_fb_sum.zwsd_srt_tests_fb_sumService _proxy2 = new Call_zwsd_srt_tests_fb_sum.zwsd_srt_tests_fb_sum.zwsd_srt_tests_fb_sumService();
                _proxy2.Credentials = new NetworkCredential("myuser", "secret pwd");
                _proxy2.CookieContainer = cookie;
                result = _proxy2.SrtTestsFbSum(P1, true);
                Console.WriteLine(result);
                Console.WriteLine("Finish");
                string response = Console.ReadLine();
            }
            catch (SoapException exc)
            {
                Console.WriteLine("Exception thrown");
                throw exc;
                string response = Console.ReadLine();
            }
        }
    }
}

Hier nochmal die XML, falls sich jemand auch da den Code anschauen möchte

Das Problem ist nach wie vor, dass zwsd_srt_tests_fb_sumService nicht erkannt wird. Es sei denn man fügt zusätzlich einen Dienstverweis ein, dann gibts aber alles doppelt.
Es muss aber laut Anleitung alles so sein. Das verwirrt mich jedoch. Denn der Aufruf eines Webdienstes sollte ja allgemein so aussehen:


// in meinem Fall doch
// zwsd_srt_tests_fb_sum.zwsd_srt_tests_fb_sum _proxy1 .....
ServerName.WebServiceName CallWebService = 
        new ServerName.WebServiceName()

Danke

N
nikg Themenstarter:in
10 Beiträge seit 2009
vor 14 Jahren

Ich bin ein Stückchen weiter gekommen.
Ich habe im Forum einen Link zu WebService-Tutorial gefunden (sehr simpel und gut aufgebaut)

Nachdem ich alles nachgebaut habe, bekam ich folgende xml


  <?xml version="1.0" encoding="utf-8" ?> 
- <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://tempuri.org/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://tempuri.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
- <wsdl:types>
- <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
- <s:element name="HelloWorld">
  <s:complexType /> 
  </s:element>
- <s:element name="HelloWorldResponse">
- <s:complexType>
- <s:sequence>
  <s:element minOccurs="0" maxOccurs="1" name="HelloWorldResult" type="s:string" /> 
  </s:sequence>
  </s:complexType>
  </s:element>
  </s:schema>
  </wsdl:types>
- <wsdl:message name="HelloWorldSoapIn">
  <wsdl:part name="parameters" element="tns:HelloWorld" /> 
  </wsdl:message>
- <wsdl:message name="HelloWorldSoapOut">
  <wsdl:part name="parameters" element="tns:HelloWorldResponse" /> 
  </wsdl:message>
- <wsdl:portType name="Service1Soap">
- <wsdl:operation name="HelloWorld">
  <wsdl:input message="tns:HelloWorldSoapIn" /> 
  <wsdl:output message="tns:HelloWorldSoapOut" /> 
  </wsdl:operation>
  </wsdl:portType>
- <wsdl:binding name="Service1Soap" type="tns:Service1Soap">
  <soap:binding transport="http://schemas.xmlsoap.org/soap/http" /> 
- <wsdl:operation name="HelloWorld">
  <soap:operation soapAction="http://tempuri.org/HelloWorld" style="document" /> 
- <wsdl:input>
  <soap:body use="literal" /> 
  </wsdl:input>
- <wsdl:output>
  <soap:body use="literal" /> 
  </wsdl:output>
  </wsdl:operation>
  </wsdl:binding>
- <wsdl:binding name="Service1Soap12" type="tns:Service1Soap">
  <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" /> 
- <wsdl:operation name="HelloWorld">
  <soap12:operation soapAction="http://tempuri.org/HelloWorld" style="document" /> 
- <wsdl:input>
  <soap12:body use="literal" /> 
  </wsdl:input>
- <wsdl:output>
  <soap12:body use="literal" /> 
  </wsdl:output>
  </wsdl:operation>
  </wsdl:binding>
- <wsdl:service name="Service1">
- <wsdl:port name="Service1Soap" binding="tns:Service1Soap">
  <soap:address location="http://localhost:2640/Service1.asmx" /> 
  </wsdl:port>
- <wsdl:port name="Service1Soap12" binding="tns:Service1Soap12">
  <soap12:address location="http://localhost:2640/Service1.asmx" /> 
  </wsdl:port>
  </wsdl:service>
  </wsdl:definitions>

Wenn ich diese mit meiner vergleiche, dann sehe ich, dass dier C#-Code


zwsd_srt_tests_fb_sum.zwsd_srt_tests_fb_sumService _proxy1 = new Call_zwsd_srt_tests_fb_sum.zwsd_srt_tests_fb_sum.zwsd_srt_tests_fb_sumService();

so heissen müsste



zwsd_srt_tests_fb_sum.service _proxy1 = new Call_zwsd_srt_tests_fb_sum.zwsd_srt_tests_fb_sum.service();

weil in der XML folgender Punkt so aussieht:


 <wsdl:service name="service">
<wsdl:port name="zwsd_srt_tests_fb_sum" binding="tns:zwsd_srt_tests_fb_sum">
<soap:address location="http://xxx..com:0000/sap/bc/srt/rfc/sap/zwsd_srt_tests_fb_sum/000/zwsd_srt_tests_fb_sum/zwsd_srt_tests_fb_sum"/>
</wsdl:port>
</wsdl:service>

Jetzt kommt aber was ganz Eigenartiges:


zwsd_srt_tests_fb_sum.service _proxy1 = new Call_zwsd_srt_tests_fb_sum.zwsd_srt_tests_fb_sum.service();
                _proxy1.Credentials = new NetworkCredential("myuser", "secret pwd");
                _proxy1.CookieContainer = cookie;
                // result = _proxy1.SrtTestsFbSum(P1, true);
                result = _proxy1.SrtTestsFbSum(P1,true);  // FEHLER  Keine Überladung für die SrtTestsFbSum-Methode nimmt 2 Argumente an.	


Code der Klasse:



   public partial class SrtTestsFbSum {
        
        private int p1Field;
        
        private bool p1FieldSpecified;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
        public int P1 {
            get {
                return this.p1Field;
            }
            set {
                this.p1Field = value;
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool P1Specified {
            get {
                return this.p1FieldSpecified;
            }
            set {
                this.p1FieldSpecified = value;
            }
        }
    }

Das kann doch jetzt nicht sein, oder? Ich übergebe doch integer und boolean! was stimmt hier nicht?
Es hat irgendwas mit dem:
public bool P1Specified { set; get; }
Member von Call_zwsd_srt_tests_fb_sum.zwsd_srt_tests_fb_sum.SrtTestsFbSum
zu tun.
Irgendwie ist der Aufruf falsch. Ich verstehe nur nicht was da falsch ist.

Hier die aktualisierte Datei zum Debuggen

J
130 Beiträge seit 2008
vor 14 Jahren

Morgen Nik!

Also du willst also einen Integer und Bool übergeben obwohl die Methode
das hier erwartet?: Ein Objekt vom Typ -> Call_zwsd_srt_tests_fb_sum.zwsd_srt_tests_fb_sum.SrtTestsFbSum

deshalb erstelle dein Objekt, hau rein was du willst (objekt besitzt ja auch ua. Attribut P1 was du übergeben wolltest, und die Methode wirds schon fressen. Aber keine Ahnung ob dir das in deinem Hauptproblem weiterhilft.


// das wuerde funktionieren, aber solltest natuerlich noch die Attribute setzen
 Call_zwsd_srt_tests_fb_sum.zwsd_srt_tests_fb_sum.SrtTestsFbSum Test = new Call_zwsd_srt_tests_fb_sum.zwsd_srt_tests_fb_sum.SrtTestsFbSum();
                result = _proxy1.SrtTestsFbSum(Test);

**“DOH !” -Homer Simpson**
N
nikg Themenstarter:in
10 Beiträge seit 2009
vor 14 Jahren

Danke für die Antwort.
ich bin nun soweit, dass ich mich über meien C#-Application einloggen kann, dort function modules aufrufen kann, an diese Werte übergeben kann. Die Funktionsbausteine (function modukles) werden auch erfoplgreich ausgeführt. Die Verbindung zu SAP und die Steuerung dortiger Funktionen läuft alsoe einwadnfrei.
Leider bekomme ich von dort keine Werte zurück.

GRUND:

der Aufruf von von der "Response"-Methode klappt nicht.
ich habe die WICHTIGEN STELLEN mit KOMMENTAREN MARKIERT // ###################################

meine Programm.cs


using System;
using System.Net;
using System.Collections.Generic;
using System.Text;
using System.Web.Services.Protocols;
using System.Web.Services;

namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                //Sample Project for calling WS in SAP and writing data
                string var_bpid = "0000000082";
                string var_bpname;

                CookieContainer cookie = new CookieContainer();
                webref_get_bp_data.service _proxy1 = new test.webref_get_bp_data.service();
                webref_get_bp_data.service _proxy2 = new test.webref_get_bp_data.service();
                webref_get_bp_data.ZGetBpDataResponse _proxy3 = new test.webref_get_bp_data.ZGetBpDataResponse();
                


                test.webref_get_bp_data.ZGetBpData myref = new test.webref_get_bp_data.ZGetBpData();
                test.webref_get_bp_data.ZGetBpDataResponse myresponse = new test.webref_get_bp_data.ZGetBpDataResponse();
                


                _proxy1.Credentials = new NetworkCredential("nikg", "maihiro");
                _proxy1.CookieContainer = cookie;

                myref.Bpid = var_bpid; // myref gets an id for passing over to the function module



                // ###################################
                // ###################################
                // ###################################
                _proxy1.ZGetBpData(myref); // call/run function module with given bpid
                
                //  WIE RUFE ICH NUN DIE ZGetBpDataResponse auf um meine Werte von SAP ZU BEKOMMEN?????
               // ###################################
               // ###################################
               // ###################################
               // ###################################

                

                var_bpid = myref.Bpid;
               
                var_bpname = myresponse.Bpname;

                Console.WriteLine(myref);
                Console.WriteLine(myref.Bpid);
                Console.WriteLine(var_bpname);
                cookie = _proxy1.CookieContainer;
                Console.WriteLine("Finish proxy1");


   
                string response = Console.ReadLine();
            }
            catch (SoapException exc)
            {
                Console.WriteLine("Exception thrown");
                throw exc;
                string response = Console.ReadLine();
            }

        }
    }
}




//------------------------------------------------------------------------------
// <auto-generated>
//     Dieser Code wurde von einem Tool generiert.
//     Laufzeitversion:2.0.50727.3082
//
//     Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
//     der Code erneut generiert wird.
// </auto-generated>
//------------------------------------------------------------------------------

// 
// Der Quellcode wurde automatisch mit Microsoft.VSDesigner generiert. Version 2.0.50727.3082.
// 
#pragma warning disable 1591

namespace test.webref_get_bp_data {
    using System.Diagnostics;
    using System.Web.Services;
    using System.ComponentModel;
    using System.Web.Services.Protocols;
    using System;
    using System.Xml.Serialization;
    
    
    /// <remarks/>
    // CODEGEN: Das optionale WSDL-Erweiterungselement 'Policy' von Namespace 'http://schemas.xmlsoap.org/ws/2004/09/policy' wurde nicht behandelt.
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "2.0.50727.3053")]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Web.Services.WebServiceBindingAttribute(Name="ZSRV_GET_BP_DATA2", Namespace="urn:sap-com:document:sap:soap:functions:mc-style")]
    public partial class service : System.Web.Services.Protocols.SoapHttpClientProtocol {
        
        private System.Threading.SendOrPostCallback ZGetBpDataOperationCompleted;
        
        private bool useDefaultCredentialsSetExplicitly;
        
        /// <remarks/>
        public service() {
            this.Url = global::test.Properties.Settings.Default.test_webref_get_bp_data_service;
            if ((this.IsLocalFileSystemWebService(this.Url) == true)) {
                this.UseDefaultCredentials = true;
                this.useDefaultCredentialsSetExplicitly = false;
            }
            else {
                this.useDefaultCredentialsSetExplicitly = true;
            }
        }
        
        public new string Url {
            get {
                return base.Url;
            }
            set {
                if ((((this.IsLocalFileSystemWebService(base.Url) == true) 
                            && (this.useDefaultCredentialsSetExplicitly == false)) 
                            && (this.IsLocalFileSystemWebService(value) == false))) {
                    base.UseDefaultCredentials = false;
                }
                base.Url = value;
            }
        }
        
        public new bool UseDefaultCredentials {
            get {
                return base.UseDefaultCredentials;
            }
            set {
                base.UseDefaultCredentials = value;
                this.useDefaultCredentialsSetExplicitly = true;
            }
        }
        
        /// <remarks/>
        public event ZGetBpDataCompletedEventHandler ZGetBpDataCompleted;
        
        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("ZGetBpDataResponse", Namespace="urn:sap-com:document:sap:soap:functions:mc-style")]
        public ZGetBpDataResponse ZGetBpData([System.Xml.Serialization.XmlElementAttribute("ZGetBpData", Namespace="urn:sap-com:document:sap:soap:functions:mc-style")] ZGetBpData ZGetBpData1) {
            object[] results = this.Invoke("ZGetBpData", new object[] {
                        ZGetBpData1});
            return ((ZGetBpDataResponse)(results[0]));
        }
        
        /// <remarks/>
        public void ZGetBpDataAsync(ZGetBpData ZGetBpData1) {
            this.ZGetBpDataAsync(ZGetBpData1, null);
        }
        
        /// <remarks/>
        public void ZGetBpDataAsync(ZGetBpData ZGetBpData1, object userState) {
            if ((this.ZGetBpDataOperationCompleted == null)) {
                this.ZGetBpDataOperationCompleted = new System.Threading.SendOrPostCallback(this.OnZGetBpDataOperationCompleted);
            }
            this.InvokeAsync("ZGetBpData", new object[] {
                        ZGetBpData1}, this.ZGetBpDataOperationCompleted, userState);
        }
        
        private void OnZGetBpDataOperationCompleted(object arg) {
            if ((this.ZGetBpDataCompleted != null)) {
                System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
                this.ZGetBpDataCompleted(this, new ZGetBpDataCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
            }
        }
        
        /// <remarks/>
        public new void CancelAsync(object userState) {
            base.CancelAsync(userState);
        }
        
        private bool IsLocalFileSystemWebService(string url) {
            if (((url == null) 
                        || (url == string.Empty))) {
                return false;
            }
            System.Uri wsUri = new System.Uri(url);
            if (((wsUri.Port >= 1024) 
                        && (string.Compare(wsUri.Host, "localHost", System.StringComparison.OrdinalIgnoreCase) == 0))) {
                return true;
            }
            return false;
        }
    }
    
    // ###################################
    // ###################################
    // ###################################
    // ###################################
    // ###################################

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.3082")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="urn:sap-com:document:sap:soap:functions:mc-style")]
    public partial class ZGetBpData {
        
        private string bpidField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute (Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
        public string Bpid {            // übergibt die bpid an das function module    
            get {
                return this.bpidField;  // holt sich die bpid aus Programm.cs              
            }
            set {
                this.bpidField = value; // übergibt den Wert an die importing-variable BPID des function modules
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.3082")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="urn:sap-com:document:sap:soap:functions:mc-style")]
    public partial class ZGetBpDataResponse {
        
        private string bpnameField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute (Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
        public string Bpname {
            get {
                return this.bpnameField;
            }
            set {
                this.bpnameField = value;
            }
        }
    }
    
    // ###################################
    // ###################################
    // ###################################
    // ###################################
    // ###################################
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "2.0.50727.3053")]
    public delegate void ZGetBpDataCompletedEventHandler(object sender, ZGetBpDataCompletedEventArgs e);
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "2.0.50727.3053")]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    public partial class ZGetBpDataCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
        
        private object[] results;
        
        internal ZGetBpDataCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : 
                base(exception, cancelled, userState) {
            this.results = results;
        }
        
        /// <remarks/>
        public ZGetBpDataResponse Result {
            get {
                this.RaiseExceptionIfNecessary();
                return ((ZGetBpDataResponse)(this.results[0]));
            }
        }
    }
}

#pragma warning restore 1591

N
nikg Themenstarter:in
10 Beiträge seit 2009
vor 14 Jahren

gelöst.
Man sollte im SAP Web Service Tool verwenden.
Es liefert einen XML für den Webservice, die RICHTIG ist und ALLES beinhaltet.
Dann bekommt man die ganzen Probleme nicht mehr.

P.S. Webservices in SAP sind die EINZIGE zukunftsträchtige Technologie.