如何解决Swagger错误“实例类型(字符串)与任何允许的基本类型都不匹配......”

问题描述 投票:6回答:2

背景

我刚刚开始了一个新项目,并希望将Swagger用于我的API文档。我目前在本地运行我的项目,在IIS中托管。

我修改了我的hosts文件,为网站提供了有效的标头。对于这篇文章,让我们说标题是publicapiurl.domain.com。所以,我在主机文件中添加了以下条目:

127.0.0.1   publicapiurl.domain.com

现在,当我输入publicapiurl.domain.com/swagger时,我得到了一个昂首阔步的文档。初始设置似乎很简单,但我的swagger doc右下角有一条红色的'ERROR {...}'消息。错误消息如下:

{"messages":["malformed or unreadable swagger supplied"],"schemaValidationMessages":[{"level":"error","domain":"validation","keyword":"type","message":"instance type (string) does not match any allowed primitive type (allowed: [\"object\"])","schema":{"loadingURI":"#","pointer":""},"instance":{"pointer":""}}]}

我过去曾与Swagger合作过,因此我将提供的链接提供给生成的swagger文档并复制代码。我将代码粘贴到swagger.io/tools编辑器中,看看他们的验证过程可能告诉我什么。我粘贴的代码经过验证,没有任何错误。这是代码:

swagger: '2.0'
info:
  version: v1
  title: Generic.Public.Api
host: publicapiurl.domain.com
schemes:
  - http
paths:
  /api/Values:
    get:
      tags:
        - Values
      operationId: Values_Get
      consumes: []
      produces:
        - application/json
        - text/json
        - application/xml
        - text/xml
      responses:
        '200':
          description: OK
          schema:
            type: array
            items:
              type: string
    post:
      tags:
        - Values
      operationId: Values_PostByvalue
      consumes:
        - application/json
        - text/json
        - application/xml
        - text/xml
        - application/x-www-form-urlencoded
      produces: []
      parameters:
        - name: value
          in: body
          required: true
          schema:
            type: string
      responses:
        '204':
          description: No Content
  '/api/Values/{id}':
    get:
      tags:
        - Values
      operationId: Values_GetByid
      consumes: []
      produces:
        - application/json
        - text/json
        - application/xml
        - text/xml
      parameters:
        - name: id
          in: path
          required: true
          type: integer
          format: int32
      responses:
        '200':
          description: OK
          schema:
            type: string
    put:
      tags:
        - Values
      operationId: Values_PutByidvalue
      consumes:
        - application/json
        - text/json
        - application/xml
        - text/xml
        - application/x-www-form-urlencoded
      produces: []
      parameters:
        - name: id
          in: path
          required: true
          type: integer
          format: int32
        - name: value
          in: body
          required: true
          schema:
            type: string
      responses:
        '204':
          description: No Content
    delete:
      tags:
        - Values
      operationId: Values_DeleteByid
      consumes: []
      produces: []
      parameters:
        - name: id
          in: path
          required: true
          type: integer
          format: int32
      responses:
        '204':
          description: No Content
definitions: {} 

有谁知道上面提到的错误实际意味着什么,或者我怎么能够解决它?

我最好的猜测是它与我修改主机文件和某种类型的CORS问题有关......但我真的很茫然。任何建议表示赞赏!

编辑:

我更简化了控制器并删除了XML响应类型,但我仍然收到在本地IIS上运行的相同错误。 swagger定义仍然在swagger在线编辑器内无错误地验证。

我也从Swashbuckle nuget包切换到Swashbuckle.Core但结果是一样的。

这是新的招摇定义:

swagger: '2.0'
info:
  version: v1
  title: Generic Public Api
host: l-publicapi.generic.com
schemes:
  - http
paths:
  /api/values/values:
    get:
      tags:
        - Values
      operationId: Values_Get
      consumes: []
      produces:
        - application/json
        - text/json
      responses:
        '200':
          description: OK
          schema:
            type: array
            items:
              type: string
  '/api/values/values/{id}':
    get:
      tags:
        - Values
      operationId: Values_GetByid
      consumes: []
      produces:
        - application/json
        - text/json
      parameters:
        - name: id
          in: path
          required: true
          type: integer
          format: int32
      responses:
        '200':
          description: OK
          schema:
            type: string
definitions: {}

还有其他建议吗?

c# asp.net-web-api swagger swagger-2.0 swashbuckle
2个回答
0
投票

有一个问题,但我不确定这是否是验证者抱怨的原因。无论如何:

在OpenAPI(fka Swagger)2.0中,操作不能同时使用表单数据和JSON / XML。这是因为使用in: formData参数描述了表单数据,而使用in: body参数描述了JSON / XML,并且对于相同的操作,body和form参数不能一起存在。这可以在OpenAPI 3.0(在撰写本文时为RC)中实现。


0
投票

我遇到了同样的问题,就像你一样,我的Swagger定义似乎是有效的,但UI仍会显示错误。我花了很多时间来解决根本问题,但无法弄明白。我最终在UI中禁用了验证,并且由于您使用的是SwashBuckle,因此可以将此代码添加到启动配置中:

GlobalConfiguration.Configuration
    .EnableSwagger(c => {
        // your configuration code here
    })
    .EnableSwaggerUi(c => {
        // other ui configuration here

        c.DisableValidator();
    });

同样,这不是对您的问题的真正修复,但如果您希望UI中的丑陋红色错误消失,这将做到这一点。

© www.soinside.com 2019 - 2024. All rights reserved.