gpt4 book ai didi

c# - ASP.NET 核心,Web API : No route matches the supplied values

转载 作者:可可西里 更新时间:2023-11-01 09:07:01 26 4
gpt4 key购买 nike

请注意:这个问题是在 2016 年提出的。这个问题的最初答案是更新 microsoft api versiong 包。最近几天,问题再次出现,但由于其他原因。

原始问题:


我在 asp.net core (web api) 中遇到了一些路由问题。

我有这个 Controller (简化版):

[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);
// neither this
var val = CreatedAtRoute("GetDocument", new { version = "1", controller = "Document", guid = doc.Guid.ToString("N")}, document);

return val;
}
}

如果我调用 Create,将创建文档并创建路由对象,但我收到错误“没有路由与提供的值匹配”并获得 500 状态。

我可以直接调用 GetByGuid,没有任何问题。

我找不到任何针对 asp.net core 的调试帮助(就像任何现有的路由调试器一样)。

如有任何帮助,我将不胜感激!

编辑看起来这是来自微软版本控制包的错误。如果我定义修复路由/api/v1/[Controller] 它正在工作。

但这对我来说不是解决方案。

最佳答案

ASP.net 核心 3

为什么会出现这个问题:

As part of addressing dotnet/aspnetcore#4849, ASP.NET Core MVC trims the suffix Async from action names by default. Starting with ASP.NET Core 3.0, this change affects both routing and link generation.

查看更多:
ASP.NET Core 3.0-3.1 | Breaking Changes | Async suffix trimmed from controller action names

正如@Chris Martinez 在这个 Github Issue 中所说:
.Net Core 3.0 and using CreatedAtRoute result in No route matches the supplied values. #558 :

The reason for the change was not arbitrary; it addresses a different bug. If you're not affected by said bug and want to continue using the Async suffix as you had been doing.

如何解决

重新启用它:

services.AddMvc(options =>
{
options.SuppressAsyncSuffixInActionNames = false;
});

您现在应该传递包含 Async 后缀的 createActionName 参数,如下所示:

返回 CreatedAtAction("PostAsync", dto)

关于c# - ASP.NET 核心,Web API : No route matches the supplied values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39459348/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com