2009-09-01 8 views
5

J'ai un fichier .wsdl que mon service Web (ancien style asmx) doit implémenter. C'est pris en charge. Lorsque je publie le service Web, vous pouvez l'appeler avec le paramètre? Wsdl pour obtenir un fichier WSDL généré.Comment inclure mon propre wsdl dans mon service Web en C#

Comment inclure mon fichier .wsdl de sorte que celui qui est renvoyé à la place du fichier généré? Est-il possible de faire avec un attribut dans ma classe de service Web?

+0

Pourquoi avez-vous besoin de faire cela? Les deux ne sont-ils pas équivalents, sinon identiques? –

+0

Le wsdl est fait à la main par l'appelant et le service que j'ai construit ne semble pas exactement le même. Je ne veux pas faire cela pour être sûr que je remplis la demande des appelants. Maintenant, ils reçoivent une erreur "Le serveur n'a pas reconnu la valeur de HTTP Header SOAPAction". Lors du débogage de cette erreur, je voudrais supprimer toutes les erreurs possibles de mon côté. –

+0

Voici un ancien post de pluralsight que je vais essayer "Utilisation d'un fichier WSDL personnalisé dans les services Web ASP.NET": http: //www.pluralsight.com/community/blogs/craig/archive/2005/12/15/17482.aspx –

Répondre

2

Faut-il rester avec l'ASMX "old-style"? Ou pourriez-vous passer à la WCF? C'est vraiment l'offre webservice la plus récente de Microsoft, et si vous faites quelque chose de nouveau et que vous êtes sur .NET 3.0 ou supérieur - pourquoi passer du temps sur la "vieille" technologie?

Dans WCF, vous pouvez certainement définir un fichier WSDL physique statique à utiliser par les clients se connectant à votre point de terminaison de métadonnées (votre URL "...? Wsdl"). Je ne sais pas si vous pouvez le faire dans ASMX, aussi.

OK, sur ASMX/.NET 2.0, vous pouvez bien sûr mettre toujours le fichier WSDL réel sous la racine de votre site Web, puis référence tout comme ceci:

http://yourwebserver/YourVirtDir/MyService.wsdl 

Je ne savoir s'il y a un moyen de « réorienter » la

http://yourwebserver/YourVirtDir/MyService.asmx?wsdl 

appel à aller qu'au lieu URL fixe. Je suis sûr que quelqu'un d'autre le saura, cependant!

Marc

+0

Pour l'instant je suis bloqué sur .NET 2.0 et ne peux pas utiliser WCF. Mais je pense qu'il est possible de travailler avec "contrat d'abord" même avec asmx et pointez votre demande? Wsdl vers un fichier séparé. –

+0

Il n'est pas possible de pointer "? Wsdl" dans un fichier séparé. Utilisez simplement le fichier .wsdl dans une URL distincte, comme celle suggérée par marc_s. –

-1

Vous pouvez générer un fichier WSDL et DISCO en pointant le Disco.exe outil livré avec le .NET Framework à votre service Web.

disco.exe http://webserver/MyWebService.asmx 

Les fichiers suivants sont créés:

results.discomap 
MyWebService.disco 
MyWebService.wsdl 
+0

Je n'ai pas besoin de générer un wsdl. L'appelant a défini le fichier wsdl. J'ai fait une implémentation d'un service Web ASP.NET (.asmx) et maintenant je voudrais rediriger les références à? Wsdl vers ce fichier .wsdl fourni. –

+0

Puis changez le fichier disco pour pointer vers votre wsdl – bryanbcook

+0

-1: cela ne fonctionne pas. –

2

Afin d'éviter la confusion d'avoir deux WSDLs différentes disponibles sur deux URL différentes (c.-à-la * .asmx URL wsdl et une URL personnalisée?) Dans votre application de service Web, vous pouvez écrire un HttpModule qui intercepte la requête vers l'URL * .asmx? wsdl et renvoie votre WSDL personnalisé à la place.

EDIT: Voici un exemple, adapté et simplifié à partir de quelque code que j'ai précédemment écrit qui rend un WSDL personnalisé disponible à l'URL standard * .asmx? Wsdl.

using System; 
using System.IO; 
using System.Web; 
using System.Web.Services.Configuration; 

namespace DemoWebService 
{ 
public class CustomWsdlModule : 
    IHttpModule 
{ 
    public void 
    Init(HttpApplication application) 
    { 
    // hook up to BeginRequest event on application object 
    application.BeginRequest += new EventHandler(this.onApplicationBeginRequest); 
    } 

    public void 
    Dispose() 
    { 
    } 

    private void 
    onApplicationBeginRequest(object source, EventArgs ea) 
    { 
    HttpApplication application = (HttpApplication)source; 
    HttpRequest request = application.Request; 
    HttpResponse response = application.Response; 

    // check if request is for WSDL file 
    if (request.Url.PathAndQuery.EndsWith(".asmx?wsdl", StringComparison.InvariantCultureIgnoreCase)) 
    { 
    // if Documentation protocol is not allowed, throw exception 
    if ((WebServicesSection.Current.EnabledProtocols & WebServiceProtocols.Documentation) == 0) 
    { 
    throw new System.InvalidOperationException("Request format is unrecognized."); 
    } 

    // get path to physical .asmx file 
    String asmxPath = request.MapPath(request.Url.AbsolutePath); 

    // build path to .wsdl file; should be same as .asmx file, but with .wsdl extension 
    String wsdlPath = Path.ChangeExtension(asmxPath, ".wsdl"); 

    // check if WSDL file exists 
    if (File.Exists(wsdlPath)) 
    { 
    // read WSDL file 
    using (StreamReader reader = new StreamReader(wsdlPath)) 
    { 
     string wsdlFileContents = reader.ReadToEnd(); 

     // write WSDL to response and end response without normal processing 
     response.ContentType = "text/xml"; 
     response.Write(wsdlFileContents); 
     response.End(); 
    } 
    } 
    } 
    } 
} 
} 

Ce code simplifié suppose que votre WSDL personnalisé est dans le même dossier que votre fichier .asmx avec une extension .wsdl. Le HttpModule doit être accroché dans votre application de service Web via le fichier web.config:

<?xml version="1.0"?> 
<configuration> 
    <!-- ... --> 
    <system.web> 
    <!-- ... --> 
    <httpModules> 
    <add 
    type="DemoWebService.CustomWsdlModule" 
    name="CustomWsdlModule"/> 
    <!-- ... --> 
    </httpModules> 
    <!-- ... --> 
    </system.web> 
    <!-- ... --> 
</configuration> 
+1

-1: La manière la plus simple d'éviter la confusion consiste simplement à supprimer le protocole 'Documentation' de l'élément' protocols' dans web.config. –

+0

Je suppose que c'était mieux d'être un commentaire sur la réponse de marc_s qu'une réponse toute seule. Toutefois, il existe toujours une valeur dans le protocole de documentation et le fait que votre WSDL se trouve à l'adresse URL que les développeurs connaissent bien en tant qu'URL WSDL pour un service Web .asmx. C'est pourquoi je m'assurerais que si je voulais que mon WSDL personnalisé soit disponible en ligne, j'utiliserais un HttpModule ou une autre technologie de réécriture d'URL pour mettre mon WSDL personnalisé à l'emplacement prévu. – GBegen

+0

Vous semblez supposer que cela fonctionnerait. Je vous suggère de ne pas faire de telles hypothèses. –

Questions connexes