Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从web api 2迁移到.net 5 web api时出现问题_C#_Asp.net_Asp.net Core_Asp.net Web Api - Fatal编程技术网

C# 从web api 2迁移到.net 5 web api时出现问题

C# 从web api 2迁移到.net 5 web api时出现问题,c#,asp.net,asp.net-core,asp.net-web-api,C#,Asp.net,Asp.net Core,Asp.net Web Api,我正在将一个使用asp.net web api 2构建的中型应用程序迁移到.net 5 web api。问题是,我现在已经重构了控制器,并发现查询字符串传递的参数在.net core for routes中的行为不同 所以我的问题是,为了能够切换到.NET5,我需要保持这些API像今天一样工作,我现在无法更改路由和参数。我有如下示例中的路由,返回错误AmbiguousMatchException:请求匹配多个端点: // GET: api/<ValuesController> [Ht

我正在将一个使用asp.net web api 2构建的中型应用程序迁移到.net 5 web api。问题是,我现在已经重构了控制器,并发现查询字符串传递的参数在.net core for routes中的行为不同

所以我的问题是,为了能够切换到.NET5,我需要保持这些API像今天一样工作,我现在无法更改路由和参数。我有如下示例中的路由,返回错误AmbiguousMatchException:请求匹配多个端点:

// GET: api/<ValuesController>
[HttpGet]
public IEnumerable<string> GetAll()
{
    return new string[] { "value1", "value2" };
}

// GET: api/<ValuesController>?message=world
[HttpGet]
public string GetMessage([FromQuery] string message)
{
    return $"Hello {message}";
}

//GET:api/
[HttpGet]
公共IEnumerable GetAll()
{
返回新字符串[]{“value1”,“value2”};
}
//获取:api/?message=world
[HttpGet]
公共字符串GetMessage([FromQuery]字符串消息)
{
返回$“Hello{message}”;
}
此控制器与web api 2配合使用。我看到有一个用于迁移的兼容包,但它在.NET5(Microsoft.AspNet.Mvc.WebApiCompatShim)中被删除了。我甚至尝试过使用它,但在注册它的使用时会出现运行时错误

我想知道是否有人经历过这个问题并成功地解决了它,我已经做了很多研究,发现最多的是一些人在谈论使用IActionConstraint,但我发现的例子是定义强制参数,它似乎不适合我的问题


如果有人知道一些可以帮助我找到解决方案的方法,我将不胜感激。

不确定您是否可以自动完成,但您可以这样做:

private IActionResult GetAll()
{
    return new string[] { "value1", "value2" };
}

[HttpGet]
public IActionResult GetMessage([FromQuery] string message)
{
    if(message == null)
        return GetAll();
    return $"Hello {message}";
}

嗨@Neil,问题是当我访问.NET5中的一些API时。由于我们当前的项目是web api 2,我们使用的是命名约定路由,在方法名称前加上HTTP动词(例如:GetMessage、PutMessage、PostMessage),web api 2能够通过方法的参数确定路由,但是这在.net核心中并没有发生,尽管项目在迁移到.net 5后正在正常编译,但一些API在路由方面存在问题,或者没有找到并返回HTTP 404,或者返回含糊不清的MatchException:请求匹配多个端点。我明白了,但问题是如何解决多重模糊匹配,我已经回答了,不是吗?对于您的另一个问题(关于自动检测动词),您必须根据需要使用[HttpGet]、[HttpPut]进行修饰。您还可以指定路由(作为[HttpGet(“路由”)的一部分)或使用单独的属性[route(“路由”)]。可能是……但这将迫使我更改所有控制器,正如我所说,这不是一个小项目,其想法是迁移到.net 5,然后开始构建应用程序的api版本2。我有比我展示的示例更复杂的控制器,目标是能够保持web api 2中的功能。如果您正在寻找快速修复方法,那么我认为没有。新的主要框架版本有时会带来破坏性的更改:-(为每个公共控制器函数添加一个属性并不难。实际上,控制器重构我已经做过,添加了HTTP动词的属性,问题是我有api,例如GET api api/users?status=active和api/users?accessLevel=admin,他可以用web api 2注册这些过滤器的路由。)使用查询字符串和.net 5,使用ControllerBase和verb属性迁移,他说路由之间存在冲突。我知道api中可能会有设计更改,但目前我无法更改所有已经使用此标准的api,我需要今天的路由。