28

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

我读过周围的地方,普遍认为这不是最佳做法。但是,我需要 WADL 来完成学校作业,因此我们将不胜感激。

4

2 回答 2

25

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

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

WADL for .NET 没有可靠的工具。

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

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

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

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

于 2012-10-19T07:05:24.830 回答
0

为什么选择 Swagger4Wcf

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

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

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 和AspNetCompatibilityRequirements 属性添加到为服务提供基本路径的类。

• 对于每个方法,添加 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。如果您遇到任何问题,请免费。

谢谢,阿比

于 2018-07-26T12:43:03.840 回答