web-dev-qa-db-fra.com

Comment appeler un service Web sans WSDL dans .NET

Je dois me connecter à un service Web tiers qui ne fournit aucun WSDL ni ASMX. L'URL du service est simplement http: //server/service.soap

J'ai lu - cet article À propos des appels de services bruts, mais je ne sais pas si c'est ce que je cherche.

En outre, j'ai demandé des fichiers WSDL, mais on dit qu'il n'y en a pas (et il n'y aura pas).

J'utilise C # avec .NET 2.0 et je ne peux pas passer à 3.5 (donc pas de WCF). Je pense que ce tiers utilise Java, car c'est l'exemple qu'ils ont fourni.

Merci d'avance!

[~ # ~] Mise à jour [~ # ~] Obtenez cette réponse lors de la navigation sur l'URL:

<SOAP-ENV:Envelope>
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Server</faultcode>
<faultstring>
Cannot find a Body tag in the enveloppe
</faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
23
MaLKaV_eS

Eh bien, j'ai enfin eu ceci pour travailler, alors je vais écrire ici le code que j'utilise. (N'oubliez pas que .NET 2.0 et pas de WSDL pour obtenir du service Web).

Tout d'abord, nous créons un httpwebrequest:

public static HttpWebRequest CreateWebRequest(string url)
{
    HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
    webRequest.Headers.Add("SOAP:Action");
    webRequest.ContentType = "text/xml;charset=\"utf-8\"";
    webRequest.Accept = "text/xml";
    webRequest.Method = "POST";
    return webRequest;
}

Ensuite, nous appelons un appel au Webservice en passant sur toutes les valeurs nécessaires. En lisant l'enveloppe SOAP à partir d'un document XML, je vais gérer les données comme un stringdiction. Devrait être une meilleure façon de le faire, mais j'y penserai plus tard:

public static XmlDocument ServiceCall(string url, int service, StringDictionary data)
{
    HttpWebRequest request = CreateWebRequest(url);

    XmlDocument soapEnvelopeXml = GetSoapXml(service, data);

    using (Stream stream = request.GetRequestStream())
    {
        soapEnvelopeXml.Save(stream);
    }

    IAsyncResult asyncResult = request.BeginGetResponse(null, null);

    asyncResult.AsyncWaitHandle.WaitOne();

    string soapResult;
    using (WebResponse webResponse = request.EndGetResponse(asyncResult))
    using (StreamReader rd = new StreamReader(webResponse.GetResponseStream()))
    {
        soapResult = rd.ReadToEnd();
    }

    File.WriteAllText(HttpContext.Current.Server.MapPath("/servicios/" + DateTime.Now.Ticks.ToString() + "assor_r" + service.ToString() + ".xml"), soapResult);

    XmlDocument resp = new XmlDocument();

    resp.LoadXml(soapResult);

    return resp;
}

Donc, c'est tout. Si quelqu'un pense que GetsOapXML doit être ajouté à la réponse, je vais l'écrire.

25
MaLKaV_eS

À mon avis, il n'y a pas d'excuse pour A SOAP Service Web pour ne pas fournir de WSDL. Il n'est pas nécessaire de générer de manière dynamique par le service; il n'est pas nécessaire de ne pas être disponible sur Internet. Mais là-bas - Doit être un WSDL, même s'ils doivent vous l'envoyer sur un disquette Thumb Drive!

Si vous avez une capacité à vous plaindre aux fournisseurs de ce service, je vous exhorte à le faire. Si vous avez la capacité de repousser, alors faites-le. Idéalement, commuter les fournisseurs de services et dire à ces personnes, c'est parce qu'ils n'ont pas fourni de WSDL. À tout le moins, découvrez pourquoi ils ne pensent pas que c'est important.

17
John Saunders

Si vous avez de la chance, vous pouvez toujours obtenir le WSDL. Certains cadres de service Web vous permettent de récupérer une WSDL générée dynamiquement.

Services Web écrits avec Axis1.x vous permettent de récupérer un fichier WSDL généré de manière dynamique en naviguant à l'URL.

Vient de parcourir

http://server/service.soap/?wsdl

Je ne sais pas si cela est possible avec d'autres cadres.

3
Glen

Hmm, délicat ici mais pas impossible mais je ferai de mon mieux pour l'expliquer.

Ce que vous aurez besoin de faire est

  1. Créez des classes sérialisables qui correspondent aux schémas d'objets que vous traitez sur le service tiers.
  2. Découvrez s'ils utilisent une soapaction dans leurs appels de service
  3. Voyez si vous pouvez créer un ASMX qui imite leur service en termes de pouvoir gérer les demandes et les réponses (cela sera bon pour tester votre application client si leur service est en panne)
  4. Vous pouvez ensuite créer un proxy de service à partir de votre service factice et modifier l'URL de service lorsque vous appelez le service tiers.
  5. Si quelque chose ne fonctionne pas dans votre client, vous pouvez modifier votre service factice, générer le proxy et réessayer.

Je vais essayer d'ajouter plus comme et quand j'y pense, mais cela devrait être suffisant pour vous aider à démarrer.

3
Keith