web-dev-qa-db-ja.com

RESTful WebサービスがWADLを自動生成

C#でRESTful Webサービスを作成し、それをIISにデプロイしました。 HeadOffice.svcサービスにアクセスすると、WSDLを表示するオプションがあります(HeadOffice.svc?wsdl)。 WADL(HeadOffice.svc?wadlなど)を表示するオプションがあります。これは可能ですか?

私は、これはベストプラクティスではないというのが一般的な見解であるということについて読みました。しかし、私は学校の課題のためにWADLを必要とするので、どんな助けでも大歓迎です。

24
David Poxon

WADLが標準ではない/広くサポートされていないことをすでに知っているとします。そして、誰かがWADLを必要とするときは、WS */SOAPサービス+ WSDLを使用する方がよいでしょう。だからあなたの仕事は非常に奇妙に見えます。

いずれにせよ、WADLは、MicrosoftのREST実装、WCF 3.5 Rest Starter Kit、WCF 4 REST、ASP.NET WebAPIのいずれでも、「そのまま」サポートされていません。

WADL for .NETの信頼できるツールはありません。

WADLを使用してC#クライアントコードを生成することが目標である場合、信じてください。自分でクライアントコードを作成するために、より多くの時間を費やすことになります。そして、そのためのより良い解決策があります。

HttpClient クラスまたは RestSharp または同様のライブラリのような新しいクラスを使用して、クライアントを簡単に手動で作成できます。これにより、.NETの信頼性のあるWADLソリューションがさらに高速になります。

Stackoverflowに関する同様の質問: WSDLの代わりにWADLを使用した.NETのRESTfulサービス

UPDATE-Swagger:数年前から swagger は、そのような形式として定着しています。 Swaggerエディター でswaggerのYAMLを使用してサービス定義の記述を開始するか、 Swashbuckle ライブラリーを使用して.NETの既存のサービスからswaggerを生成させます。 2番目は、WSDLで使用したものであり、swaggerエディターを使用して、クライアントとサーバーのボイラープレートを生成できます。サーバーまたはクライアントを生成しているのか、あるいはファンではないにせよ、swaggerは実際にはRESTサービスの非常に優れた契約交換フォーマットであり、理想的ではありませんが、優れたオプションです。

23
Regfor

なぜSwagger4Wcfなのか

•swaggerのyaml記述を手動で記述し、それを維持する。特にWCFサービスは退屈です。

•WCF(_ServiceContract/OperationContract/WebGet/WebInvoke_)で使用される属性に一致する各インターフェイスのSwagger 2.0のyaml記述を自動的に生成するSwagger4WCFと呼ばれるnugetパッケージがあります。

2. Swaggerがバックグラウンドでどのように機能するか

Swagger4WCFは、NuPackポストビルドパターンを使用して、ビルド時にトリガーします。

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

  1. ビルド時に、出力ディレクトリに存在するアセンブリを検出し、mono.cecilでそれらを開いて(アセンブリを反映するため)、swagger 2.0の期待されるyaml記述を生成します。 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が実装されました。問題が発生した場合は解放してください。

ありがとう、Abhi

0
Abhimanyu