3

ミドルウェア階層に問題があります。私はASP.NET Core API変更ミドルウェア階層

[Route("api/v1/values")] 
    public class ValuesController : Controller 
    { 
    // GET api/v1/values/5 
    [HttpGet("{id}")] 
    public async Task<IActionResult> Get(string id) 
    { 
     return await Task.Run<IActionResult>(() => 
     { 
     if (id == "nf") 
     { 
      return NotFound(); 
     } 

     return Ok($"value: {id}"); 
     }); 
    } 
    } 

Iが一致した場合、MVCを使用するか、そうでない場合は、応答にデフォルトを書き込むようにルーティングを設定し、一方のコントローラ/アクションで非常に単純なWeb APIを作成しました。

app.UseMvc(); 

app.Use(async (context, next) => 
{ 
    await context.Response.WriteAsync("Default"); 
}); 

そして、あなたは、サンプルのリクエスト/レスポンス見ることができるの下に、これは、素晴らしい作品:

/api/v1/values/1 -> 200, Body: "value: 1" 
/api/v1/values/nf -> 404 
/api/v1/values -> "Default" 

グレートを、その後私はApiVersioningを追加しましたので、コントローラは次のようになります。

[ApiVersion("1")] 
[Route("api/v{version:apiVersion}/values")] 
public class ValuesController : Controller 

とスタートアップ:services.AddApiVersioning();に追加しました。それは完全にルーティングを中断し、各リクエストごとに私は最後のapp.Useを削除したときに応答 "Default"を取得します。ルーティングは値のコントローラーで正常に動作しますが、デフォルトのミドルウェアはありません。前回と同じように私はどのように回答を得ることができますが、ApiVersioningで知っていますか?

+0

リクエストから 'v1'を削除するとデフォルトのミドルウェアに当たっていますか?例えば'/ api/values' – Brad

+0

apiのバージョニングがなければ、デフォルトのミドルウェアを使用します。私は何を要求しても、それは常にデフォルトのルーティングにヒットしています。 – us3r

答えて

0

これを試してください。

[ApiVersion("1.0")] 
[Route("api/v{version:apiVersion}/foo")] 
public class FooController {} 

とスタートアップクラスの

public void ConfigureServices(IServiceCollection services) 
     { 
      services.AddApiVersioning(options => 
      { 
       options.ReportApiVersions = true; 
       options.AssumeDefaultVersionWhenUnspecified = true; 
       options.DefaultApiVersion = new ApiVersion(1, 0); 
      }); 
     } 

私が試してみましたが、それが私のために働きました。

+0

これは動作しません。すべての要求は「デフォルト」を返します。また、Starutp.Configureメソッドがどうやってうまくいくのかを教えてください。 – us3r