Service web RESTful auto-générer WADL

j'ai créé un service Web reposant en C# et je l'ai déployé à L'IIS. Quand je accéder au service HeadOffice.svc, j'ai la possibilité de voir le WSDL (HeadOffice.svc?wsdl). Ce que je voudrais faire est d'avoir la possibilité de voir le WADL (par exemple HeadOffice.svc?wadl). Est-ce possible?

j'ai lu autour de l'endroit qui, de l'avis général, c'est que ce n'est pas la meilleure pratique. Cependant, j'ai besoin de la WADL pour un devoir scolaire, de sorte que toute aide serait beaucoup apprécier.

21
demandé sur John Saunders 2012-10-19 09:39:59

2 réponses

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

de toute façon WADL n'est pas pris en charge" out of the box " dans toute implémentation REST de Microsoft, ni WCF 3.5 Rest Starter Kit, ni WCF 4 REST, et ASP.NET WebAPI.

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

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

vous pouvez utiliser de nouvelles classes comme HttpClient classe ou RestSharp ou des bibliothèques similaires pour écrire facilement manuellement votre client et il sera encore plus rapide de googler pour la solution WADL fiable pour .NET

question similaire sur stackoverflow: Restful service in .NET with WADL au lieu de WSDL

mise à JOUR - Swagger: Depuis quelques années swagger s'est établi comme tel format. Vous pouvez soit commencer à écrire la définition de service en utilisant le YAML de swagger dans le Swagger editor ou laisser générer swagger à partir de services existants, pour .NET en utilisant Swashbuckle bibliothèque. Deuxième c'est quelque chose que nous avions avec WSDL, et l'éditeur de swagger vous permet de générer des boilerplates client et serveur. Peu importe que vous génériez votre serveur ou client ou pas fan de lui, swagger est en fait un très bon format d'échange de contrat pour le service de repos, pas idéal mais bonne option.

19
répondu Regfor 2018-01-18 08:45:17

Pourquoi Swagger4Wcf

•rédaction manuelle de la description yaml pour swagger et l'entretenir spécialement les services WCF sont ennuyeux.

•il existe un paquet nuget appelé Swagger4WCF qui génère automatiquement la description 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 NuPack post build modèle de 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 assemblages présents dans le répertoire de sortie, Les ouvrira avec mono.cecil (pour refléter les assemblages) pour générer la description yaml attendue pour swagger 2.0. Swagger4WCF détecte WebGet/WebInvoke pour fournir Verbe/Méthode style de sérialisation en yaml.

étapes pour mettre en œuvre Swagger dans votre application:

  1. Install SwaggerWcf package

  2. configurer les routes de la WCF

nous devons ajouter la route dans la méthode Application_Start à L'intérieur de Global.asax 1519110920"

 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)));
    }

Note: Éditer Web.config et ajouter le la suite (si il n'existe pas encore) à l'intérieur du système.serviceModel block

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
  1. Configuration WCF réponse automatique types (facultatif)

nous devons ajouter ce qui suit À Web.config. Cela permettra au service WCF d'accepter les requêtes et d'envoyer des réponses basées sur les en-têtes de type Content.

   <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 des 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 des services WCF classe

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

• pour chaque méthode, ajouter le SwaggerWcfTag pour catégoriser la méthode et la réponse est donnée 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. types de données utilisées dans les services de la 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 wcf for Swagger implémenté. N'hésitez pas si vous rencontrez le moindre problème.

Merci, Abhi

0
répondu Abhimanyu 2018-07-27 09:07:05