【问题标题】:RESTful web service auto-generate WADLRESTful Web 服务自动生成 WADL
【发布时间】:2012-10-19 05:39:59
【问题描述】:

我在 C# 中创建了一个 RESTful Web 服务并将其部署到 IIS。当我访问 HeadOffice.svc 服务时,我可以选择查看 WSDL (HeadOffice.svc?wsdl)。我想做的是可以选择查看 WADL(例如 HeadOffice.svc?wadl)。这可能吗?

我在各处读到过,普遍认为这不是最佳做法。但是,我需要 WADL 来完成学校作业,因此我们将不胜感激。

【问题讨论】:

    标签: c# auto-generate wadl


    【解决方案1】:

    假设您已经知道 WADL 不是标准的/没有得到广泛支持。而当有人需要 WADL 时,使用 WS*/SOAP 服务 + WSDL 可能会更好。所以你的任务看起来很奇怪。

    无论如何,Microsoft 的任何 REST 实现、WCF 3.5 Rest Starter Kit、WCF 4 REST 和 ASP.NET WebAPI 都不支持“开箱即用”的 WADL。

    对于 .NET 的 WADL 没有可靠的工具。

    当您的目标是使用 WADL 生成 C# 客户端代码时,相信我,您将花费更多时间来自己编写客户端代码。并且有更好的解决方案。

    您可以使用HttpClient 类或RestSharp 等新类或类似的库来轻松手动编写您的客户端,这将比谷歌搜索可靠的 .NET WADL 解决方案更快

    关于stackoverflow的类似问题:Restful service in .NET with WADL instead of WSDL

    更新 - 招摇: 多年来,swagger 已经确立了这种格式。您可以使用 Swagger editor 中的 swagger 的 YAML 开始编写服务定义,也可以使用 Swashbuckle 库从现有服务生成 .NET 的 swagger。第二个是我们使用 WSDL 的东西,swagger 编辑器让您生成客户端和服务器样板。不管你是在生成服务器还是客户端,不管你是否喜欢它,swagger 实际上是一种非常好的 REST 服务合约交换格式,虽然不理想,但却是不错的选择。

    【讨论】:

    • 感谢您的信息!我打算从 WADL 生成 Java 代码。但是,看起来我需要开辟一条不同于 WADL 的道路。
    • 第一个链接完全没用,看起来你已经链接到一个甚至没有任何源代码的项目。有什么意义?
    • Dmitri Nesteruk Point 是像那个链接这样的 WADL 对于 .NET 来说已经死了并且已经过时了。最好手动编写服务访问,然后尝试以 WSDL SOAP 样式生成
    • 以防万一有人想为 OpenAPI(又名 Swagger)API 生成 C# HttpCllient - 您可以使用 NSwagStudio 甚至使用 OpenAPI (Swagger) Connected Service  -  一个 Visual Studio 2017 扩展使用NSwag 生成它。
    【解决方案2】:

    为什么选择 Swagger4Wcf

    •手动为swagger编写yaml描述并维护它,尤其是WCF服务很无聊。

    •有一个名为 Swagger4WCF 的 nuget 包,它会为 WCF 使用的每个接口匹配属性自动生成 swagger 2.0 的 yaml 描述 (ServiceContract/OperationContract/WebGet/WebInvoke)。

    2。 Swagger 如何在后台工作

    Swagger4WCF 使用 NuPack 后构建模式在构建时触发。

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

    1. 在构建时,它将检测输出目录中存在的程序集,使用 mono.cecil 打开它们(以反映程序集)以生成预期的 yaml 描述 swagger 2.0。 Swagger4WCF 检测 WebGet/WebInvoke 以在 yaml 中提供序列化样式的 Verb/Method。

    在您的应用程序中实现 Swagger 的步骤:

    1. 安装 SwaggerWcf 包

    2. 配置 WCF 路由

    我们必须在 Global.asax 中的 Application_Start 方法中添加路由

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

    注意:编辑 Web.config 并在 system.serviceModel 块中添加以下内容(如果尚不存在)

        <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
    
    1. 配置 WCF 响应自动类型(可选)

    我们必须将以下内容添加到 Web.config。这将允许 WCF 服务接受请求并根据 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. 装饰 WCF 服务接口 对于每个方法,我们都要配置 WebInvoke 或 WebGet 属性,并添加一个 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. 装饰 WCF 服务类

    • 将 SwaggerWcf 和 A​​spNetCompatibilityRequirements 属性添加到为服务提供基本路径的类。

    • 对于每个方法,添加 SwaggerWcfTag 以对方法进行分类,并为来自服务的每个可能响应添加 SwaggerWcfResponse。

    [SwaggerWcfTag("Books")]
    [SwaggerWcfResponse(HttpStatusCode.OK, "Book found, value in the response body")]
    [SwaggerWcfResponse(HttpStatusCode.NoContent, "No books", true)]
    public Book[] ReadBooks()
    {
    }
    
    1. 装饰 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; }
      }
      

    参考:-https://github.com/abelsilva/swaggerwcf

    这就是 Swagger 实现的 wcf。 如果您遇到任何问题,请免费。

    谢谢, 阿比

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 2014-06-09
    • 2012-11-15
    • 2016-03-24
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多