Swagger 2.0不支持:使用路径“ api / Client”和方法“ GET”进行的多项操作

时间:2019-10-09 11:38:35

标签: c# swagger swashbuckle

在我的网络api中,我有2种Get方法,一种用于获取所有客户端,一种通过ID获取客户端

  [HttpGet]
    public async Task<IHttpActionResult> GetClients()
    {
        var telemetry = new TelemetryClient();
        try
        {
            var roles = await CosmosStoreHolder.Instance.CosmosStoreClient.Query().ToListAsync();
            return Ok(roles);
        }
        catch (System.Exception ex)
        {
            string guid = Guid.NewGuid().ToString();
            var dt = new Dictionary<string, string>
            {
                { "Error Lulo: ", guid }
            };

            telemetry.TrackException(ex, dt);
            return BadRequest("Error Lulo: " + guid);
        }
    }

    [HttpGet]
    public async Task<IHttpActionResult> GetClient(string clientId)
    {     
        var telemetry = new TelemetryClient();
        try
        {
            var clientStore = CosmosStoreHolder.Instance.CosmosStoreClient;
            var client = await clientStore.Query().FirstOrDefaultAsync(x => x.Id == clientId);
            if (client == null)
            {
                return NotFound();
            }
            return Ok(client);
        }
        catch (System.Exception ex)
        {
            telemetry.TrackException(ex);
            return BadRequest("Unknown error");
        }
    }

我刚刚安装了十字花并按照此配置:

https://www.c-sharpcorner.com/article/implementing-swagger-in-web-api/

但是我收到下面的错误

  

500 : {"Message":"An error has occurred.","ExceptionMessage":"Not supported by Swagger 2.0: Multiple operations with path 'api/Client' and method 'GET'. See the config setting - \"ResolveConflictingActions\" for a potential workaround","ExceptionType":"System.NotSupportedException","StackTrace":" at Swashbuckle.Swagger.SwaggerGeneratorOptions.DefaultConflictingActionsResolver(IEnumerable 1   apiDescriptions)\ r \ n位于   Swashbuckle.Swagger.SwaggerGenerator.CreatePathItem(IEnumerable 1 apiDescriptions, SchemaRegistry schemaRegistry)\r\n at Swashbuckle.Swagger.SwaggerGenerator.<>c__DisplayClass7.<GetSwagger>b__4(IGrouping 2   组)\ r \ n位于   System.Linq.Enumerable.ToDictionary [TSource,TKey,TElement](IEnumerable 1 source, Func 2 keySelector,Func 2 elementSelector, IEqualityComparer 1比较器)\ r \ n位于   Swashbuckle.Swagger.SwaggerGenerator.GetSwagger(String rootUrl,String   apiVersion)\ r \ n位于   Swashbuckle.Application.SwaggerDocsHandler.SendAsync(HttpRequestMessage   请求,在以下位置使用CancellationToken cancellingToken)\ r \ n   System.Net.Http.HttpMessageInvoker.SendAsync(HttpRequestMessage   请求,在以下位置使用CancellationToken cancellingToken)\ r \ n   System.Web.Http.Dispatcher.HttpRoutingDispatcher.SendAsync(HttpRequestMessage   请求,在以下位置使用CancellationToken cancellingToken)\ r \ n   System.Net.Http.DelegatingHandler.SendAsync(HttpRequestMessage   请求,在以下位置使用CancellationToken cancellingToken)\ r \ n   System.Web.Http.HttpServer.d__0.MoveNext()“}   https://webapi-app.azurewebsites.net/swagger/do`cs / v1

1 个答案:

答案 0 :(得分:3)

您的问题是由string参数引起的,默认情况下字符串可以为空。
您的操作路线:

  • GetClients()
  • GetClient(string clientId)

将相同。

如果它是整数,则路由将如下所示:
/api/Controller/{clientId}
并且不会与GetClients冲突。

更改数据类型可能不是一种选择,您可能被迫使用路由:


查看我的一些示例,我发现该控制器使用路由和多个Gets:

http://swagger-net-test.azurewebsites.net/swagger/ui/index?filter=Location#/

您可以看到我在同一个控制器下有多个获取,但是它们的动作略有不同:

[RoutePrefix("Location")]
public class LocationController : ApiController
{
    [Route("Get1")]
    public GeolocateResponse Get1([FromUri] GeolocateResponse x)
    {
        return x;
    }

    [Route("Get2")]
    public Location Get2([FromUri] Location x)
    {
        return x;
    }