【问题标题】:Is there a way to automatically generate Swagger tags from precomipled C# Azure Functions?有没有办法从预编译的 C# Azure Functions 自动生成 Swagger 标签?
【发布时间】:2018-01-30 04:38:17
【问题描述】:

是否有人知道任何可用于注释预编译 C# Azure 函数的 .NET 属性,以便它可以自动生成 Swagger 标签?例如,我想在 Swagger 中自动生成“标签”条目:

/api/v1/revision:
    get:
      operationId: /api/v1/revision/get
      tags:
        - System
      produces: []
      consumes: []
      parameters: []
      description: Gets the API version
      responses:
        '200':
          description: Success operation
      security:
        - apikeyQuery: []

这是我的 C# 函数:

 public static class VersioningService
    {
        [FunctionName("ApiVersion")]
        public static async Task<HttpResponseMessage> ApiVersion([HttpTrigger(AuthorizationLevel.Function, "get", Route = "v1/revision")]HttpRequestMessage req, TraceWriter log)
        {
            return req.CreateResponse(HttpStatusCode.OK, "<p>API Version: 1.0340");
        }
    }

【问题讨论】:

    标签: c# azure swagger azure-mobile-services


    【解决方案1】:

    很遗憾,目前似乎不支持。我还在 github 中找到了类似的issue。您也可以将您的 feedback 提供给 Azure 功能团队。

    【讨论】:

      【解决方案2】:

      找到这篇文章:

      我已经使用 powershell 实现了这些步骤。
      该脚本假定您有一个已配置的host.json 文件:

      {
        "swagger": {
          "enabled": true
        }
      }
      

      此脚本仅适用于 Azure Function 运行时 v1,尚未为运行时 v2 实现 swagger 生成

      function Get-KuduApiAuthorisationHeaderValueAzure {
          Param
          (
              [Parameter(Mandatory = $true)]
              [string]$resourceGroupName,
              [Parameter(Mandatory = $true)]
              [string]$functionappName
          )
          Begin {               
              $resourceType = "Microsoft.Web/sites/config"
              $resourceName = "$functionappName/publishingcredentials"
              $publishingCredentials = Invoke-AzureRmResourceAction -ResourceGroupName $resourceGroupName -ResourceType $resourceType -ResourceName $resourceName -Action list -ApiVersion 2015-08-01 -Force
      
              $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $publishingCredentials.Properties.PublishingUserName, $publishingCredentials.Properties.PublishingPassword)))
              return $base64AuthInfo
          }
      }
      
      function Get-MasterAPIKey {
          Param
          (
              [Parameter(Mandatory = $true)]
              [string]$resourceGroupName,
              [Parameter(Mandatory = $true)]
              [string]$functionappName
          )
          Begin {               
              $kuduApiAuthorisationToken = Get-KuduApiAuthorisationHeaderValueAzure -resourceGroupName $resourceGroupName -functionappName $functionappName
              $apiUrl = "https://$functionappName.scm.azurewebsites.net/api/functions/admin/masterkey"
              $response = Invoke-RestMethod -Uri $apiUrl -Headers @{Authorization = ("Basic {0}" -f $kuduApiAuthorisationToken);"If-Match"="*"}
              return $response.masterKey
          }
      }
      
      function Get-FunctionsApiJwt {
          Param
          (
              [Parameter(Mandatory = $true)]
              [string]$resourceGroupName,
              [Parameter(Mandatory = $true)]
              [string]$functionappName
          )
          Begin {               
              $base64AuthInfo = Get-KuduApiAuthorisationHeaderValueAzure -resourceGroupName $resourceGroupName -functionappName $functionappName
              $apiUrl = "https://$functionappName.scm.azurewebsites.net/api/functions/admin/token"
              $jwt = Invoke-RestMethod -Uri $apiUrl -Headers @{Authorization = ("Basic {0}" -f $base64AuthInfo)} -Method GET
      
              return $jwt
          }
      }
      
      function Generate-SwaggerDefinition {
          Param
          (
              [Parameter(Mandatory = $true)]
              [string]$resourceGroupName,
              [Parameter(Mandatory = $true)]
              [string]$functionappName
          )
          Begin {   
      
              # Get the swagger documentation key
              $masterKey = Get-MasterAPIKey -resourceGroupName $resourceGroupName -functionappName $functionappName
              $apiUrl = "https://$functionappName.azurewebsites.net/admin/host/systemkeys/swaggerdocumentationkey"
              $swaggerdocumentationkey = (Invoke-RestMethod -Uri $apiUrl -Headers @{"x-functions-key"=$masterKey} -Method Post).value
      
              # Update the resource
              $config = Get-AzureRmResource -ResourceGroupName $resourceGroupName -ResourceType "microsoft.web/sites/config" -Name "$functionappName/web" -ApiVersion "2015-08-01"
              $config.Properties.apiDefinition = @{"url"="https://$functionappName.azurewebsites.net/admin/host/swagger?code=$swaggerdocumentationkey"}
              $config | Set-AzureRmResource -Force -ApiVersion "2015-08-01"
      
              # Generate the swagger definition
              $jwt = Get-FunctionsApiJwt -resourceGroupName $resourceGroupName -functionappName $functionappName
              $swaggerDefinition = (Invoke-RestMethod -Uri "https://$functionappName.azurewebsites.net/admin/host/swagger/default?code=$swaggerdocumentationkey" -Headers @{Authorization=("Bearer {0}" -f $jwt)} -Method Get)
      
              # Save the swagger definition
              Invoke-RestMethod -Uri "https://$functionappName.azurewebsites.net/admin/host/swagger?code=$swaggerdocumentationkey" -ContentType 'application/json' -Headers @{Authorization=("Bearer {0}" -f $jwt)} -Method Post -Body (ConvertTo-Json $swaggerDefinition -Depth 100)
          }
      }
      

      你可以这样调用这个脚本:

      Generate-SwaggerDefinition -resourceGroupName "myresourcegroupname" -functionappName "myfunctionappname"
      

      编辑

      新创建的函数应用默认使用 TLS 1.2,因此您需要在 Powershell 脚本顶部添加此行:

      [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-10
        • 2020-11-13
        • 2020-03-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多