Swashbuckle.AspNetCore(1.0.0)パッケージを取得して出力を生成するのに問題があります。 swagger.jsonファイルを「〜/ swagger/docs/v1」に書き込む必要があることを読みました。ただし、出力が得られません。
私は新しいASP.NET Core APIプロジェクトから始めました。これはASP.NET Core 2であることに言及する必要があります。APIは機能し、値コントローラーから値を正常に取得できます。
スタートアップクラスの構成は、この記事で説明されているとおりです( GitHubのSwashbuckle.AspNetCore )。
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
// Enable middleware to serve generated Swagger as a JSON endpoint.
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "MyAPI V1");
});
}
else
{
app.UseExceptionHandler();
}
app.UseStatusCodePages();
app.UseMvc();
//throw new Exception();
}
}
NuGetリファレンスを確認できます...
繰り返しますが、これはすべてデフォルトのテンプレートですが、参照用にValuesControllerを含めています...
[Route("api/[controller]")]
public class ValuesController : Controller
{
// GET api/values
[HttpGet]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET api/values/5
[HttpGet("{id}")]
public string Get(int id)
{
return "value";
}
// POST api/values
[HttpPost]
public void Post([FromBody]string value)
{
}
// PUT api/values/5
[HttpPut("{id}")]
public void Put(int id, [FromBody]string value)
{
}
// DELETE api/values/5
[HttpDelete("{id}")]
public void Delete(int id)
{
}
}
Configureで次の2行を見逃したと思います。
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
// Enable middleware to serve generated Swagger as a JSON endpoint.
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "MyAPI V1");
});
}
Swagger UIにアクセスするには、URLを http:// localhost:XXXX/swagger / にする必要があります
JsonはSwagger UIの上部にあります。
#if DEBUG
// For Debug in Kestrel
c.SwaggerEndpoint("/swagger/v1/swagger.json", "Web API V1");
#else
// To deploy on IIS
c.SwaggerEndpoint("/webapi/swagger/v1/swagger.json", "Web API V1");
#endif
IIS webapi(base URL)にデプロイされると、アプリケーションエイリアスになります。 swaggerは「/swagger/v1/swagger.json」の場所でswagger.jsonを探しますが、アプリケーションエイリアス(ベースURL)のプレフィックスは付けないため、すべてのIISデプロイメントに対してアプリケーションエイリアス(ベースURL)を維持する必要があります。それが機能しない理由です。
例えば:
localhost/swagger/v1/swagger.json-swagger.jsonが見つかりませんでした
同じ問題がありました。 http:// localhost:XXXX/swagger/v1/swagger.json を確認してください。エラーが発生した場合は、修正してください。
たとえば、ベースコントローラークラスにあいまいなルートがあり、「アクションのあいまいなHTTPメソッド。アクションにはSwagger 2.0の明示的なHttpMethodバインディングが必要です。」というエラーが表示されました。ベースコントローラーを使用する場合は、パブリックメソッドがHttpGet/HttpPost/HttpPut/HttpDelete OR Route属性を使用して、あいまいなルートを避けるようにしてください。
それから、同じメソッドでHttpGet( "route")とRoute( "route")の両方の属性を定義しました。これはswaggerの最後の問題でした。
私は似たような問題に直面していましたが、swaggerの問題はまったく同じではありませんでした。うまくいけば、これは他の人の助けになります。
カスタムドキュメントタイトルを使用しており、ドキュメントタイトルに一致するようにSwaggerEndPointのフォルダーパスを変更していませんでした。エンドポイントをswagger/v1/swagger.jsonに向けたままにすると、swagger UIでjsonファイルが見つかりません。
例:
services.AddSwaggerGen(swagger =>
{
swagger.SwaggerDoc("AppAdministration", new Info { Title = "App Administration API", Version = "v1.0" });
});
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/AppAdministration/swagger.json", "App Administration");
});
アプリケーションがIIS/IIS Expressでホストされている場合は、次を試してください。
c.SwaggerEndpoint("../swagger/v1/swagger.json", "MyAPI V1");
次の2つの規則に従う必要があります。
[HttpGet("xxx")]
の代わりに、[HttpPost("xxx")]
、[Route("xxx")]
または...などの明示的なHttpメソッドですべてのアクションを装飾します。[NoAction]
属性を使用して、コントローラーのパブリックメソッドを飾ります。http:// localhost:XXXX/swagger /http:// localhost:XXXX/swagger/v1/swagger.json ファイルのページリクエストですが、例外は上記のルールに従わない場合、Swaggerから発生します。
答えを見て、推奨事項を確認した後、何が間違っていたのか見当もつかないことになります。
文字通りすべてを試したので、同じ状況に陥った場合は、問題は別のものであり、完全に無関係であることを理解してください。
私の場合、OData例外でした。
Localhost:xxxx/swaggerを開いて開発者ツールを開き、コンソールのエラーをクリックすると、問題の原因となっている内部例外が表示されます。
役立つことを願っています
Swaggerを使用するときによく発生するエラーは、(NET ASP)に複数のルートに同じ名前を付けることです。このため、swaggerはJSONファイルを生成できません。たとえば、これは間違った方法です
[HttpPost, Route("Start")]
public async Task<TransactionResult> WipStart(BodyWipStartDTO data)
{
return await _wipServices.WipStart(data);
}
ルート名は同じだがアクション名が異なる他のアクション
[HttpPost, Route("Start")]
public async Task<TransactionResult> WipAbort(BodyWipStartDTO data)
{
return await _wipServices.WipAbort(data);
}
これは正しい方法です
[HttpPost, Route("Start")]
public async Task<TransactionResult> WipStart(BodyWipStartDTO data)
{
return await _wipServices.WipStart(data);
}
[HttpPost, Route("Abort")]
public async Task<TransactionResult> WipAbort(BodyWipStartDTO data)
{
return await _wipServices.WipAbort(data);
}
個人的に私は同じ問題を抱えていましたが、しばらくして今日もう一度試してみると、新しいバージョン(2.5.0)で json になっていることがわかりました-にあったエラーの説明を見ることができました- ここ 。
また、解決に役立ったもう1つのことは、ソリューションフォルダーのルートにある "..vs\config\applicationhost.config"内に保持されているWebサイトに接続されているホスティング情報を削除することでした。
Webサイトを構成していた要素を削除しました。
<site name="**" id="9">
<application path="/" applicationPool=""></application>
<bindings></bindings>
</site>
Postパラメーターで内部クラスを使用したときにこの問題が発生しました
[HttpPost]
public async Task Post([FromBody] Foo value)
{
}
フーはどこ
public class Foo
{
public IEnumerable<Bar> Bars {get;set;}
public class Bar
{
}
}
URLバージョン管理の代わりにバージョンヘッダーを使用してAPIのバージョン2を作成すると、このSwaggerエラーが発生しました。回避策は、バージョン1メソッドに[Obsolete]
属性を追加し、SwaggerGeneratorOptions
を使用して、Startup
-> ConfigureServices
メソッドの廃止されたAPIメソッドを無視することでした。
services.AddSwaggerGen(c =>
{
c.SwaggerGeneratorOptions.IgnoreObsoleteActions = true;
c.SwaggerDoc("v2", new Info { Title = "My API", Version = "v2" });
});
同じ問題に遭遇しましたが、私のAPIがルートフォルダーと仮想ディレクトリでホストされていないことに気付きました。 APIをIISのルートフォルダーに移動して作業しました。
詳細 この回答では
コントローラーに固有のURLにマップする問題がある場合、このエラーが発生します。
問題の原因を見つける最良の方法は、すべてのコントローラーをプロジェクトから除外することです。次に、1つのコントローラーまたはコントローラー内の1つ以上のメソッドを一度に有効にしてアプリを実行し、問題のあるコントローラー/コントローラーメソッドを見つけます。または、賢くなり、バイナリ検索ロジックを実行して、無効な複数のコントローラー/メソッドを有効にして、障害のあるコントローラー/メソッドを見つけます。
原因のいくつかは
HTTPメソッド属性のないパブリックメソッドをコントローラーに持つ
「[アクション]」ベースのマッピングを使用していない場合、同じapi呼び出しにマップできる同じHttp属性を持つ複数のメソッドがある
簡単できれいなこれらの手順に従ってください。
Ambiguous HTTP method for action. Actions require an explicit HttpMethod binding for Swagger 2.0.
」などのエラーが表示される場合は、コンソールを確認してください各エンドポイントにはメソッドが必要です(get/post/put/delete)
。 Solution:
各コントローラーを再確認し、期待されるメソッドが追加されていることを確認してください。
(または、どのコントローラーがあいまいさを引き起こしているかをコンソールエラーで確認できます)