web-dev-qa-db-fra.com

Le service Web RESTful génère automatiquement WADL

J'ai créé un service Web RESTful en C # et l'ai déployé sur IIS. Lorsque j'accède au service HeadOffice.svc, j'ai la possibilité d'afficher le WSDL (HeadOffice.svc? Wsdl). Ce que je voudrais faire, c’est d’avoir la possibilité d’afficher le fichier WADL (par exemple, HeadOffice.svc? Wadl). Est-ce possible?

J'ai lu partout autour de la place que l'opinion générale est que ce n'est pas la meilleure pratique. Cependant, j'ai besoin de la WADL pour un travail scolaire, donc toute aide serait la bienvenue.

22
David Poxon

Supposons que vous savez déjà que WADL n'est pas standard/n'est pas largement supporté. Et lorsque quelqu'un a besoin de WADL, il peut être préférable d'utiliser le service WS */SOAP + WSDL. Votre tâche semble donc très étrange.

Quoi qu'il en soit, la WADL n'est pas prise en charge «prête à l'emploi» dans les implémentations REST de Microsoft, ni dans le Kit de démarrage WCF 3.5 Rest, ni dans le REST WCF 4 ni dans WebAPI ASP.NET.

Il n'y a pas d'outils fiables pour WADL for .NET.

Lorsque votre objectif est de générer du code client C # à l'aide de WADL, croyez-moi, vous passerez plus de temps à écrire du code client par vous-même. Et il existe de meilleures solutions pour cela.

Vous pouvez utiliser de nouvelles classes telles que HttpClient class ou RestSharp ou des bibliothèques similaires pour facilement écrire manuellement votre client. Ce sera encore plus rapide que de rechercher une solution WADL fiable pour .NET.

Question similaire sur stackoverflow: Service reposant dans .NET avec WADL au lieu de WSDL

UPDATE - Swagger: Depuis quelques années swagger s’est établi comme tel. Vous pouvez commencer à écrire la définition de service en utilisant le YAML de swagger dans Swagger editor ou laisser générer des swagger à partir de services existants, pour .NET en utilisant Swashbuckle library. La seconde est quelque chose que nous avons eu avec WSDL, et swagger editor vous permet de générer des passerelles client et serveur. Que vous génériez votre serveur, votre client ou pas, fanfaron, swagger est en fait un très bon format d’échange de contrat pour le service REST. Ce n’est pas une option idéale, mais une bonne.

20
Regfor

Pourquoi Swagger4Wcf

• Écrire manuellement la description de yaml pour swagger et la conserver, en particulier les services WCF sont ennuyeux. 

• Un paquet de nuget appelé Swagger4WCF génère automatiquement une description de yaml pour swagger 2.0 pour chaque interface correspondant aux attributs utilisés par WCF (ServiceContract/OperationContract/WebGet/WebInvoke).

2. Comment Swagger fonctionne en arrière-plan

Swagger4WCF utilise le modèle de post-génération NuPack pour se déclencher au moment de la construction.

https://www.codeproject.com/Tips/1190360/How-to-setup-a-managed-postbuild-without-scripting

  1. Au moment de la construction, il détectera les assemblys présents dans le répertoire de sortie et les ouvrira avec mono.cecil (pour refléter les assemblys) afin de générer la description yaml attendue pour swagger 2.0 . Swagger4WCF détecte WebGet/WebInvoke pour fournir Verb/Method en style de sérialisation en yaml.

Étapes pour implémenter Swagger dans votre application:

  1. Installer le paquet SwaggerWcf

  2. Configurer les itinéraires WCF

Nous devons ajouter la route dans la méthode Application_Start dans Global.asax

 protected void Application_Start(object sender, EventArgs e)
    {
        RouteTable.Routes.Add(new ServiceRoute("v1/rest", new WebServiceHostFactory(), typeof(BookStore)));
        RouteTable.Routes.Add(new ServiceRoute("api-docs", new WebServiceHostFactory(), typeof(SwaggerWcfEndpoint)));
    }

Remarque: Modifiez Web.config et ajoutez les éléments suivants (s’il n’existe pas encore) dans le bloc system.serviceModel.

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
  1. Configurer les types automatiques de réponse WCF (facultatif)

Nous devons ajouter ce qui suit à Web.config. Cela permettra au service WCF d'accepter les demandes et d'envoyer des réponses en fonction des en-têtes Content-Type.

   <behavior name="webHttpBehavior">
              <webHttp defaultOutgoingResponseFormat="Json" automaticFormatSelectionEnabled="true"/>
            </behavior>
          </endpointBehaviors>
          <serviceBehaviors>
            <behavior>
              <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
              <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
              <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
              <serviceDebug includeExceptionDetailInFaults="false"/>
            </behavior>
  1. Décorer les interfaces de services WCF Pour chaque méthode, nous devons configurer l'attribut WebInvoke ou WebGet et ajouter un attribut SwaggerWcfPath.

    [SwaggerWcfPath("Get book", "Retrieve a book from the store using its id")] [WebGet(UriTemplate = "/books/{id}", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)] [OperationContract] Book ReadBook(string id);

  2. Décorer la classe de services WCF

• Ajoutez les attributs SwaggerWcf et AspNetCompatibilityRequirements à la classe fournissant le chemin de base du service.

• Pour chaque méthode, ajoutez le SwaggerWcfTag pour catégoriser la méthode et le SwaggerWcfResponse pour chaque réponse possible du service.

[SwaggerWcfTag("Books")]
[SwaggerWcfResponse(HttpStatusCode.OK, "Book found, value in the response body")]
[SwaggerWcfResponse(HttpStatusCode.NoContent, "No books", true)]
public Book[] ReadBooks()
{
}
  1. Décorer les types de données utilisés dans les services WCF

    [DataContract] [Description("Book with title, first publish date, author and language")] [SwaggerWcfDefinition(ExternalDocsUrl = "http://en.wikipedia.org/wiki/Book", ExternalDocsDescription = "Description of a book")]

    public class Book
    {
        [DataMember]
        [Description("Book ID")]
        public string Id { get; set; }
    
        [DataMember]
        [Description("Book Title")]
        public string Title { get; set; }
    
        [DataMember]
        [Description("Book First Publish Date")]
        public int FirstPublished { get; set; }
    
        [DataMember]
        [Description("Book Author")]
        public Author Author { get; set; }
    
        [DataMember]
        [Description("Book Language")]
        public Language Language { get; set; }
    }
    

Référence: - https://github.com/abelsilva/swaggerwcf

C’est ça que wcf for Swagger a implémenté . S'il vous plaît, libérez-vous si vous rencontrez un problème.

Merci, Abhi

0
Abhimanyu