Tests du SAP Web Service avec WSDL

Rédigé par Sozezzo - - Aucun commentaire

Web service avec SAP PI  +  WSDL  +  Tests

Problématique:

Le SAP rendre disponible des Web Services par PI (Process Integration) pour réaliser des transactions entre les clients et le SAP.

Les clients peuvent être des applications développées sur plusieurs plateformes, en tous cas, pendant le processus du développement du client, il  faut avoir certaines conditions et disponibilités:

  • instance du SAP/PI configuré;
  • bonnes données pour les tests;
  • contrôle du temps de réponse;

Le WSDL est le point de départ du développement du client.

Dans ce cas, le client est développé en C#.

Les étapes d'utilisation:

1. Créer un projet et ajouter un "Web Reference" par "Service Reference";

 


using ConsoleWSDL.MyWebServiceName;

 

namespace ConsoleWSDL

{

    static class Program

    {

        static void Main(string[] args)

        {

            using (MyWebServiceName.TestService service = new MyWebServiceName.TestService())

            {

 

                // Initialisation

                var d = new DT_Param

                {

                    EDI_DC20 = new DT_Param_DC20 {SERIAL = "123"}

                };

 

                // Call web service

                var ret = service.Test(d);

 

            }

        }

    }

}

 

 

Dans ce moment, on peut finir notre exercice, et développer le code pour le traitement des paramètres et de la réponse selon le WSDL utilisé.

Par contre, il faut avoir la disponibilité du SAP et des données valides.

 

Deuxième problème: Un nouveau code a besoin de beaucoup de tests, et la certitude de réponses prévisibles et contrôlées;

Alors, on essaie de remplacer les incertitudes causées par l'utilisation du SAP et avoir contrôlé sur les réponses du Web Service.

Solution proposée: Creer un "Web Service" qui remplace le SAP Web Service.

 

Créer une classe avec la définition du WSDL


private static string ConvertWSDL_To_WSClass(string textWsdl, string protocol)

{

 

        byte[] byteArray = Encoding.UTF8.GetBytes(textWsdl);

        MemoryStream stream = new MemoryStream(byteArray);

 

        ServiceDescription wsdlDescription = ServiceDescription.Read(stream); ;

        ServiceDescriptionImporter wsdlImporter = new ServiceDescriptionImporter();

 

        wsdlImporter.ProtocolName = protocole;  // Soap | Soap12

        wsdlImporter.AddServiceDescription(wsdlDescription, null, null);

        wsdlImporter.Style = ServiceDescriptionImportStyle.Server;

 

        wsdlImporter.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties;

 

        CodeNamespace codeNamespace = new CodeNamespace();

        CodeCompileUnit codeUnit = new CodeCompileUnit();

        codeUnit.Namespaces.Add(codeNamespace);

 

        ServiceDescriptionImportWarnings importWarning = wsdlImporter.Import(codeNamespace, codeUnit);

 

        if (importWarning != 0) return importWarning.ToString();

 

        StringBuilder stringBuilder = new StringBuilder();

        StringWriter stringWriter = new StringWriter(stringBuilder);

 

        CodeDomProvider codeProvider = CodeDomProvider.CreateProvider("CSharp");

        codeProvider.GenerateCodeFromCompileUnit(codeUnit, stringWriter, new CodeGeneratorOptions());

 

        stringWriter.Close();

 

        return stringBuilder.ToString();

}

Il faut vérifier si le WSDL utilise le protocole SOAP 1.1 ou SOAP 1.2

Creer un projet "Web Application" vide pour ajouter le Web Service de test.

 

Voici le code créé que l'on va changer:


using System.Web.Services;

 

namespace WebApplicationTest

{

    /// <summary>

    /// Summary description for WebServiceTest

    /// </summary>

    [WebService(Namespace = "http://tempuri.org/")]

    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

    [System.ComponentModel.ToolboxItem(false)]

    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.

    // [System.Web.Script.Services.ScriptService]

    public class WebServiceTest : System.Web.Services.WebService

    {

 

        [WebMethod]

        public string HelloWorld()

        {

            return "Hello World";

        }

    }

}

 

1. Changer l’héritage de la classe avec la classe créée avec la définition du WSDL;

2. Ajouter la méthode interne de la classe;

3. Ajouter les qualifications  :

        [System.Web.Services.WebMethodAttribute()]

        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://sap.com/xi/WebService/soap1.1")]

 

Voici le code modifié:


using System;

using System.Web.Services;

 

namespace WebApplicationTest

{

    /// <summary>

    /// Summary description for WebServiceTest

    /// </summary>

    [WebService(Namespace = "http://tempuri.org/")]

    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

    [System.ComponentModel.ToolboxItem(false)]

    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.

    // [System.Web.Script.Services.ScriptService]

    public class WebServiceTest : TestServiceService

    {

 

        [System.Web.Services.WebMethodAttribute()]

        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://sap.com/xi/WebService/soap1.1")]

        public override string TestService(DT_Param_DC20 MT_Param_DV20)

        {

            throw new NotImplementedException();

        }

    }

}

Il faut ajouter le traitement nécessaire à la fonctionnalité désirée du "Web Service" selon le cas, la réponse peut être une valeur constante pour l'aider le développement du code de la communication vers le SAP.

Finalement, pour utiliser le test, on doit changer l'URL vers le Web Service de test.

Voici le code modifié:


using ConsoleWSDL.MyWebServiceName;

 

namespace ConsoleWSDL

{

    static class Program

    {

        static void Main(string[] args)

        {

            using (MyWebServiceName.ConfirmationTimeTicket_AsyncService service = new MyWebServiceName.ConfirmationTimeTicket_AsyncService())

            {

                // My new address to test

                service.Url = "http://localhost:1234/WebServiceTest.asmx";

 

                // Initialisation

                var d = new DT_ConfirmationTimeTicket

                {

                    EDI_DC40 = new DT_ConfirmationTimeTicketEDI_DC40 {SERIAL = "123"}

                };

                // Call web service

                service.ConfirmationTimeTicket_Async(d);

            }

        }

    }

}

 

 

* Attention : si l'on ajoute des lignes ou des espaces dans le fichier du WSDL, on peut avoir des erreurs pour créer la classe du Web Service.

 

sources:
https://code.msdn.microsoft.com/Generating-a-Web-Service-95ff4e10

http://www.codeproject.com/Articles/172725/Integrating-SAP-Web-Services-into-Microsoft-NET-En

http://forums.asp.net/t/1204267.aspx?Server+did+not+recognize+the+value+of+HTTP+Header+SOAPAction

 

 

Les commentaires sont fermés.