web-dev-qa-db-ja.com

Swagger 2.0ではサポートされていません:パスを使用した複数の操作

WebApi 2アプリケーションにswaggerを統合しました。アプリケーションに単一のコントローラーがある場合は正常に機能します。アプリケーションに2番目のコントローラーを追加したとき。私は次のエラーが発生しました:

エラーが発生しました。 Swashbuckle.Swagger.Swagger.SwaggerGeneratorOptions.DefaultConflictingActionsResolver(IEnumerable1 apiDescriptions)\r\n at Swashbuckle.Swagger.SwaggerGenerator.CreatePathItem(IEnumerable 1 apiDescriptions、SchemaRegistryで構成設定-潜在的な回避策については\ "ResolveConflictingActions \"を参照してください。 schemaRegistry)\ r\n at Swashbuckle.Swagger.SwaggerGenerator。<> c__DisplayClass7.b__4(IGrouping2 group)\r\n at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable 1 source、Func _2 keySelector, Func_ 2 elementSelector、IEqualityComparer1 comparer)\r\n at Swashbuckle.Swagger.SwaggerGenerator.GetSwagger(String rootUrl, String apiVersion)\r\n at Swashbuckle.Application.SwaggerDocsHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)\r\n at System.Net.Http.HttpMessageInvoker.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)\r\n at System.Web.Http.Dispatcher.HttpRoutingDispatcher.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)\r\n at System.Net.Http.DelegatingHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)\r\n at System.Web.Http.Cors.CorsMessageHandler.<SendAsync>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.HttpServer. d__0.MoveNext() "}- http:// localhost:50950/swagger/docs/v1

2番目のコントローラーでは、次の2つのメソッドを追加しました。

_ string Get(string username, string password);

 string Get(string credential);
_

メソッドの1つをコメントする場合。その後、正常に動作します。

それを修正する方法はありますか?

20
user2266837

ファイル内AppStart/SwaggerConfig.cs

最初に、Linqをインポートする必要があります

using System.Linq;

同じファイルにこの行を追加します

c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());

すぐ内側:

GlobalConfiguration.Configuration 
                .EnableSwagger(c =>
                    { ...

1つの考慮事項:コントローラーでは、Http methods

[HttpGet]
[Route("something")]
public List<model> something(){....}

[HttpGet]
[Route("something2")]
public List<model2> something2(){....}

[HttpPost]
[Route("mypost1")]
public List<model> mypost1(){....}

[HttpPost]
[Route("mypost2")]
public List<model2> mypost2(){....}
29
MrMins

上記の2つの方法には2つのオプションがあります。

  1. 2つのメソッドを3つのパラメーターを持つ単一のメソッドに結合します-それぞれがクエリ文字列に含まれます

  2. -api/controller/byusernameapi/controller/bycredentialsのような個別のルートURLがあります

8
Silly John

コントローラーのルートを変更できます。

デフォルト値は[Route("api/[controller]")]です

[Route("api/[controller]/[action]")]に変更できます

私が見たことのない答え:私は使用法を増やしました。

私のコントローラーにはいくつかのMVCアイテム(リストアイテム)があるため、リンクがあります。

using System.Web.Http;
using System.Web.Mvc;

このため、どういうわけか、2回登録されました(私は推測します)。 RoutePrefix/Route/HttpGetなどの完全修飾を使用することで問題が修正されました。

namespace MyNameSpace
{
    [System.Web.Http.RoutePrefix("api/Reports")]
    public class ReportsController
    {
        {...constructor...}

        [System.Web.Http.Route("Scans")]
        [System.Web.Http.HttpGet,ResponseType(typeof(List<ReportClass>))]
        public ascyn Task<HttpResponseMessage> GetScans() {...}
0
WernerCD

競合するメソッドに個別のルートを追加します。上の[Route("GetByType")]や別の[Route("GetById")]など

0

この問題は、属性ルーティングを使用する状況でも発生する可能性があります。

属性ルートがルーティングテーブルルートと競合する場合、「複数の操作」エラーが発生します。

例:

[HttpGet]
[SwaggerOperation("GetByUsername")]
[Route("[path]/User")]
public IHttpActionResult GetUser(string username)
{

}

属性ルーティングの詳細: https://docs.Microsoft.com/en-us/aspnet/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web- api-2

0
FrankyHollywood