Using Swagger with WCF REST

2020-02-29 01:13发布

I have a WCF REST based service that I would like to add Swagger to. I have installed Swagger.NET package, my project is using .NET 4.0. I have also enabled XML documentation, etc... but now I am not sure the best route from here.

When i launch http://localhost/SwaggerUI/index.html I get the default page with the http://YOUR-URL-HERE:PORT/api/swagger. I am not sure what url should go here. I did enable help of the service via: <standardEndpoint name="" helpEnabled="true" /> which does give me the ugly page here: http://localhost/api/help -- when i plug that into Swagger i just get the result:

200 : OK http://localhost/api/help

What is the best way to proceed, i am not using WebApi but have many of the features available if that helps.

标签: wcf rest swagger
3条回答
可以哭但决不认输i
2楼-- · 2020-02-29 01:35

I tried to implement swagger for WCF in my application as the implementation is different as we implanted for web API(simpler). I will tell you how its different and how it works step by step:-

**1. Why Swagger4Wcf**
----------------------

•Manually writing yaml description for swagger and maintain it especially WCF services are boring. 
•There is a nuget package called Swagger4WCF that automatically generates yaml description for swagger 2.0 for each interface matching attributes used by WCF (ServiceContract/OperationContract/WebGet/WebInvoke).

2. How Swagger Works in the Background
--------------------------------------

Swagger4WCF uses NuPack post build pattern to trigger at build time.
https://www.codeproject.com/Tips/1190360/How-to-setup-a-managed-postbuild-without-scripting
3.At build time, it will detect assemblies present in output directory, open them with mono.cecil (to reflect assemblies) to generate expected yaml description for swagger 2.0.
Swagger4WCF detects **WebGet/WebInvoke** to provide Verb/Method in serialization style in yaml.

Steps to implement Swagger in your application:-

1. Install SwaggerWcf package

2. Configure WCF routes
We have to add the route in the Application_Start method inside 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)));
            }



Note: Edit Web.config and add the following (if it doesn't exist yet) inside the system.serviceModel block

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>

3. Configure WCF response auto types (optional)
We have to add the following to Web.config. This will allow the WCF service to accept requests and send replies based on the Content-Type headers.






      <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>



4. Decorate WCF services interfaces
For each method, we have to configure the WebInvoke or WebGet attribute, and add a SwaggerWcfPath attribute.



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




5. Decorate WCF services class

•   Add the SwaggerWcf and AspNetCompatibilityRequirements attributes to the class providing the base path for the service.
•   For each method, add the SwaggerWcfTag to categorize the method and theSwaggerWcfResponse for each possible response from the service.



[SwaggerWcfTag("Books")]
[SwaggerWcfResponse(HttpStatusCode.OK, "Book found, value in the response body")]
[SwaggerWcfResponse(HttpStatusCode.NoContent, "No books", true)]
public Book[] ReadBooks()
{
}



6. Decorate data types used in WCF services



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

 That's it wcf for Swagger implemented.
Please free if you face any issue.

Thanks,
Abhi
查看更多
爱情/是我丢掉的垃圾
3楼-- · 2020-02-29 01:36

As of December 2015, there is an implementation of Swagger for Wcf now. You should check this out - Swagger for WCF - SwaggerWcf

查看更多
Rolldiameter
4楼-- · 2020-02-29 01:37

Currently there are no implementations of Swagger for WCF. You will either need to implement your own by following the spec from https://github.com/wordnik/swagger-core/wiki, or wait patiently for someone to implement one for you.

I currently have an implementation in progress, but it's not quite ready for primetime. The basic spec is deceptively simple, but fitting it to WCF is a definite challenge.

查看更多
登录 后发表回答