asp.netコア(web api)のルーティングに問題があります。
私はこのコントローラーを持っています(簡略化):
[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/[Controller]")]
public class DocumentController : Controller
{
[HttpGet("{guid}", Name = "GetDocument")]
public IActionResult GetByGuid(string guid)
{
var doc = DocumentDataProvider.Find(guid);
if (doc == null)
return NotFound();
return new ObjectResult(doc) {StatusCode = 200};
}
[HttpPost]
public IActionResult Create([FromBody] Document doc)
{
//... Creating Doc
//Does not work
//var val = CreatedAtRoute("GetDocument", new {guid = doc.Guid.ToString("N")}, document);
//or this: CreatedAtRoute("GetDocument", new { controller = "Document", guid = doc.Guid.ToString("N")}, document);
var val = CreatedAtRoute("GetDocument", new { version = "1", controller = "Document", guid = doc.Guid.ToString("N")}, document);
return val;
}
}
Createを呼び出すと、ドキュメントが作成され、ルーティングオブジェクトが作成されますが、「指定された値に一致するルートはありません」というエラーが発生し、ステータスが500になります。
問題なくGetByGuidを直接呼び出すことができます。
(既存のルーティングデバッガーのように)asp.netコアのデバッグヘルプが見つかりませんでした。
何か助けていただければ幸いです!
[〜#〜] edit [〜#〜] Microsoftのバージョン管理パッケージのバグのようです。私はそれが機能している修正ルート/ api/v1/[Controller]を定義します。
しかし、それは私の解決策ではありません。
私自身の質問に答えます。これは、実際にはMicrosoftのバージョン管理パッケージのバグであり、まもなく修正される予定です。
https://github.com/Microsoft/aspnet-api-versioning/issues/18
そのバグが修正されるまで、代わりにreturn CreatedAtAction("ActionMethodName", dto);
を使用しました。
私はこの投稿が2017年のものであることを知っていますが、それでも私は同じ問題に直面し、ここにたどり着きました。そして、あなたは間違いを見つけたことがないように見えるので、この投稿を見つけた他の人のためにここに書きます。
問題は、あなたが電話するとき:
CreatedAtRoute("GetDocument", new { version = "1", controller = "Document", guid = doc.Guid.ToString("N")}, document);
3つのパラメータ(この場合は3つの文字列)を受け取る「GetDocument」関数を探すようにプログラムに指示していますが、実際の「GetDocument」定義は「guid」である1つの文字列のみを受け取ります。
[HttpGet("{guid}", Name = "GetDocument")]
public IActionResult GetByGuid(string guid)
{
var doc = DocumentDataProvider.Find(guid);
if (doc == null)
return NotFound();
return new ObjectResult(doc) {StatusCode = 200};
}
それが機能するためには、次のようにする必要があります:
CreatedAtRoute("GetDocument", new { guid = doc.Guid.ToString("N")}, document);
もう1つのオプションは、3つの文字列を使用して新しいgetメソッドを作成することです。おそらく、「GetDocument」とは異なるものを呼び出す必要があります。
これがこれを探している次の人に役立つことを願っています:D。
これの代わりに:
CreatedAtRoute("GetDocument", new { version = "1", controller = "Document", guid = doc.Guid.ToString("N")}, document);
返品を次のように変更します。
return CreatedAtRoute("GetDocument",doc, null);