Créer un service SOAP en C#

Saad Aslam 12 octobre 2023
  1. Brève explication de SOAP
  2. Services Web SOAP
  3. Appeler un service SOAP avec le .NET Core en C#
  4. Utiliser la classe SoapClientMessage en C#
  5. Créer un service SOAP avec ASP.NET Core en C#
Créer un service SOAP en C#

Vous n’êtes pas seul si vous souhaitez utiliser SOAP ou WCF avec ASP.NET Core. C’est l’une des fonctionnalités les plus recherchées et les plus recherchées de .NET Core.

Dans cet article, nous verrons comment utiliser un service WCF SOAP à partir de votre application .NET Core. Nous démontrons également l’utilisation d’ASP.NET Core pour établir et héberger un service SOAP.

Brève explication de SOAP

SOAP (Simple Object Access Protocol) est un protocole de transfert de données structurées à travers des systèmes dispersés et peut-être divers. Son format de communication est XML et repose sur des protocoles de couche application tels que HTTP.

La majorité des gens le connaissent comme protocole standard pour les services en ligne.

SOAP était la norme de facto pour la création de services Web jusqu’à récemment, et l’architecture orientée services (SOA) en dépendait fortement. SOAP établit un format de message qui doit être suivi, mais nous sommes libres d’y inclure ce que nous voulons - des pièces jointes binaires sont même disponibles.

Le standard SOAP fournit une enveloppe contenue (enveloppe >), qui peut inclure un en-tête (header >) et un corps (body >), ce dernier pouvant contenir une section de faute (fault >) ainsi que d’autres sous-sections. Seul body > est requis, et fault > est réservé aux réponses, et non aux demandes, dans lesquelles une erreur s’est produite.

La possibilité d’incorporer des portions de matériel binaire pendant un message s’appelle le mécanisme d’optimisation de la transmission des messages (MTOM), et c’est une alternative à l’utilisation de Base-64 pour coder les flux binaires, ce qui les rend 30 % plus gros.

Services Web SOAP

Lors de l’appel aux services en ligne, l’organisme doit inclure l’action à effectuer et les arguments éventuellement fournis. POST est toujours utilisé par les services Web SOAP et l’enveloppe est toujours envoyée en tant que charge utile à une seule URL bien connue.

L’infrastructure de service Web acheminera la demande vers une classe et une fonction système spécifiques.

Le service Web met à disposition un fichier WSDL (Web Services Definition Language) qui contient des informations sur le service, telles que le nom de chaque méthode d’action, les arguments et les valeurs de retour pour chacune, ainsi que les erreurs attendues. Visual Studio (et d’autres outils comme le programme de ligne de commande SVCUtil.exe) peut produire des proxies de code qui s’interfacent avec le service Web à l’aide de ce WSDL.

Appeler un service SOAP avec le .NET Core en C#

Par conséquent, si vous souhaitez utiliser WCF côté client avec .NET Core, vous le pouvez. Tout d’abord, vérifiez que vous avez bien inclus le System.ServiceModel.

Une des primitives System ServiceModel.Http ou System (pour les liaisons BasicHttpBinding/BasicHttpsBinding ou NetHttpBinding/NetHttpsBinding, qui englobent SOAP et REST). ServiceModel.NetTcp est un protocole qui permet d’émettre et de recevoir (pour NetTcpBinding, un protocole binaire uniquement Windows).

Prenons un exemple de base.

Tout d’abord, le contrat :

public interface IPServ {
  string P(string msg);
}

Puis le code client :

var bind = new BasicHttpBinding();
var endp = new EndpointAddress(new Uri("[url]"));
var cF = new ChannelFactory(bind, endp);
var servC = cF.CreateChannel();
var res = servC.Ping("Ping");
cF.Close();

Tout est identique à ce qu’il serait si vous travailliez dans le framework .NET complet, comme vous pouvez le voir. Puisqu’il n’y a pas de fichiers App.config ou Web.config, vous devrez tout configurer manuellement, comme créer la liaison et l’adresse de point de terminaison correctes.

Vous pouvez également générer manuellement des classes proxy compatibles .NET Core à l’aide du programme svcutil.exe. Cela vous permettra d’utiliser .NET Core.

Il est facile d’oublier à quel point il peut être difficile de configurer ASP.NET Core avec SOAP lorsque vous considérez à quel point c’est facile.

Utiliser la classe SoapClientMessage en C#

L’extension SOAP qui enregistre les messages SOAP remis et reçus par un client de service Web XML inclut le segment de code suivant. Le SoapClientMessage envoyé dans la SoapExtension est traité par ce fragment.

La fonction ProcessMessage de l’extension SOAP écrit les propriétés SoapClientMessage dans le fichier journal.

// Process the SOAP message received and write it to a log file.
public override void PM(SoapMessage m) {
  switch (m.Stage) {
    case SoapMessageStage.BeforeSerialize:
      break;
    case SoapMessageStage.AfterSerialize:
      WriteOutput((SoapClientMessage)m);
      break;
    case SoapMessageStage.BeforeDeserialize:
      WriteInput((SoapClientMessage)m);
      break;
    case SoapMessageStage.AfterDeserialize:
      break;
    default:
      throw new Exception("this is and invalid state");
  }
}

En sortie, le journal du message SOAP sortant vers le fichier est appelé le fichier journal.

public void WO(SoapClientMessage m) {
  newStream.Position = 0;
  FileStream mf = new FileStream(filename, FileMode.Append, FileAccess.Write);
  StreamWriter ms = new StreamWriter(mf);
  ms.WriteLine("--> Requested at " + DateTime.Now);

  // Print to the log file the  field of request header for header SoapAction .
  ms.WriteLine("The  Http SoapAction  header request field is: ");
  ms.WriteLine("\t" + m.Action);

  // Write the client type that called the XML Web service method to the log file.
  ms.WriteLine("The client type is: ");
  if ((m.Client.GetType()).Equals(typeof(MathSvc)))
    ms.WriteLine("\tMathSvc");

  // The client's technique will be printed to the log file.
  ms.WriteLine("The approach that the client has requested is:");
  ms.WriteLine("\t" + m.MethodInfo.Name);

  // The client's technique will be printed on the log file.
  if (m.OneWay)
    ms.WriteLine("The client does not wait for the server to complete the task.");
  else
    ms.WriteLine("The client waits for the server to complete the task.");

  // The URL of the site that implements the method is printed to the log file.
  ms.WriteLine("The XML Web service method that has been requested has the following URL: ");
  ms.WriteLine("\t" + m.Url);
  ms.WriteLine("The SOAP envelope's contents are as follows: ");
  ms.Flush();

  // Copy one stream's content to another.
  Copy(newStream, mf);
  mf.Close();
  newStream.Position = 0;

  // Copy one stream's content to another.
  Copy(newStream, oldStream);
}

Créer un service SOAP avec ASP.NET Core en C#

Pour le côté client, par exemple, vous pouvez utiliser la même classe que celle que nous avons montrée précédemment. Vous devrez développer une classe de service qui implémente le contrat côté serveur :

public class SS : IPServ {
  public string P(string m) {
    return string.Join(string.Empty, m.Reverse());
  }
}

Et il ne nous reste plus qu’à enregistrer la mise en place du service à l’adresse suivante :

public void ConfigServ(IServColl s) {
  s.AddSingleton(new PingService());
  s.AddMvc();
  // rest code goes here
}
public void Conf(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) {
  app.UseSoapEndpoint(path: "/PingService.svc", binding: new BasicHttpBinding());
  app.UseMvc();
  // rest code goes here
}

Si vous souhaitez :

s.AddSoapExceptionTransformer((ex) = > ex.Message);

Le code injecte un middleware personnalisé dans le pipeline ASP.NET Core qui écoute les POST HTTP et vérifie les en-têtes valides. Il extrait la méthode d’action et les paramètres de la charge utile avant de la transmettre à la classe d’implémentation spécifiée.

Une poignée de points à considérer

  1. L’extension .svc n’est pas nécessaire ; c’est simplement là pour nous rappeler que la WCF l’exigeait auparavant.
  2. Pour PingService, vous pouvez utiliser n’importe quel cycle de vie, pas seulement des singletons.
  3. Les liaisons client et serveur doivent être identiques.
  4. Vous ne pourrez utiliser aucun des filtres ASP.NET Core car ils seront ignorés, mais vous pouvez utiliser l’injection de dépendance à la place.

Même si vous pouvez certainement utiliser ce code pour la compatibilité descendante, soyez conscient des contraintes suivantes si vous devez écrire un service SOAP dans .NET Core (par exemple, si vous devez le déployer sur Docker) :

  1. Les normes WS - * ne sont pas prises en charge.
  2. Il n’y a pas de support pour MTOM.
  3. Hormis HTTPS et la sécurité intégrée d’ASP.NET Core, la sécurité n’est pas prise en charge.
  4. Il n’y aura pas de limitation ou de comportement inapproprié.
Auteur: Saad Aslam
Saad Aslam avatar Saad Aslam avatar

I'm a Flutter application developer with 1 year of professional experience in the field. I've created applications for both, android and iOS using AWS and Firebase, as the backend. I've written articles relating to the theoretical and problem-solving aspects of C, C++, and C#. I'm currently enrolled in an undergraduate program for Information Technology.

LinkedIn