我在C#中创建了一个RESTful Web服务,并将其部署到IIS。当我访问服务HeadOffice.svc时,我可以选择查看WSDL(HeadOffice.svc?wsdl)。我想做的是可以选择查看WADL(例如HeadOffice.svc?wadl)。这可能吗?
我已经阅读了一般意见认为这不是最佳做法的地方。但是,我需要WADL作为学校作业,所以任何帮助都会非常感激。
答案 0 :(得分:20)
假设您已经知道WADL不是标准/不广泛支持。当有人需要WADL时,可能会更好地使用WS * / SOAP服务+ WSDL。所以你的任务看起来很奇怪。
无论如何,在Microsoft的任何REST实现中都没有“开箱即用”的WADL,WCF 3.5 Rest Starter Kit,WCF 4 REST和ASP.NET WebAPI都不支持。
WADL for .NET没有可靠的工具。
当您的目标是使用WADL生成C#客户端代码时,请相信我,您将花费更多时间自己编写客户端代码。并且有更好的解决方案。
您可以使用HttpClient类或RestSharp或类似库等新类轻松手动编写客户端,然后使用Google搜索可靠的WADL .NET解决方案
关于stackoverflow的类似问题:Restful service in .NET with WADL instead of WSDL
UPDATE - Swagger: 多年来swagger已经确立了自己的格式。您可以使用Swagger editor中的swagger的YAML开始编写服务定义,也可以使用Swashbuckle库为.NET生成来自现有服务的swagger。第二个是我们使用WSDL的东西,并且swagger编辑器允许您生成客户端和服务器样板。无论您是在生成服务器还是客户端,还是没有它的粉丝,swagger实际上是一种非常好的REST服务合同交换格式,不是理想的选择。
答案 1 :(得分:0)
•手动编写摇摇欲坠的yaml描述并对其进行维护尤其是WCF服务很无聊。
•有一个名为Swagger4WCF的nuget程序包,它为WCF(ServiceContract/OperationContract/WebGet/WebInvoke
)使用的每个接口匹配属性自动为swagger 2.0生成Yaml描述。
Swagger4WCF使用NuPack后构建模式在构建时触发。
https://www.codeproject.com/Tips/1190360/How-to-setup-a-managed-postbuild-without-scripting
在您的应用程序中实现Swagger的步骤:
安装SwaggerWcf软件包
配置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"/>
我们必须将以下内容添加到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>
装饰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);
装饰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()
{
}
装饰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。 如果您遇到任何问题,请释放。
谢谢, 阿比