web-dev-qa-db-ja.com

ASP.NET CORE、Web API:指定された値に一致するルートはありません

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]を定義します。

しかし、それは私の解決策ではありません。

14
maerlin

私自身の質問に答えます。これは、実際にはMicrosoftのバージョン管理パッケージのバグであり、まもなく修正される予定です。

https://github.com/Microsoft/aspnet-api-versioning/issues/18

8
maerlin

そのバグが修正されるまで、代わりにreturn CreatedAtAction("ActionMethodName", dto);を使用しました。

3
redwards510

私はこの投稿が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。

1

これの代わりに:

CreatedAtRoute("GetDocument", new { version = "1", controller = "Document", guid = doc.Guid.ToString("N")}, document);

返品を次のように変更します。

return CreatedAtRoute("GetDocument",doc, null);
0
nPcomp