请求/WebImages/index触发AmbiguousMatchException,是否因执行Scaffold-DbContext导致?
问题场景
当请求页面
http://localhost:56191/WebImages/index时,出现以下错误:
处理请求时发生未处理的异常。
AmbiguousMatchException: 请求匹配了多个端点。匹配项:
WebApp.Controllers.WebImagesController.Index (WebApp)
WebApp.Views.WebImagesController.Index (WebApp)
Microsoft.AspNetCore.Routing.Matching.DefaultEndpointSelector.ReportAmbiguity(CandidateState[] candidateState)
用户疑问:这个异常是否是因为执行以下更新数据库的命令导致的?
Scaffold-DbContext "Server=Machinexx; Database=MyDBxx; Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -force
解答
别担心,我来帮你理清楚——这个异常和你执行的Scaffold-DbContext命令没有直接关系。
先拆解下异常核心原因:AmbiguousMatchException触发的本质是ASP.NET Core的路由系统找到了两个能响应/WebImages/index请求的端点:一个是你控制器中定义的Index action方法,另一个是被错误识别为端点的Views目录下的相关文件(大概率是视图文件的命名或路由配置出了问题,比如不小心让视图类和控制器action重名,或者路由规则同时匹配了控制器action和静态文件/视图端点)。
而你执行的Scaffold-DbContext命令,作用仅仅是根据数据库结构生成对应的实体类和DbContext文件,并且只会操作Models目录下的内容,完全不会改动控制器、视图或者路由配置相关的代码,所以它不可能引发端点冲突的问题。
给你几个实用的排查方向:
- 检查
WebImagesController类,看看是不是存在多个同名的Indexaction方法(比如不同Http请求方法的action,但没通过路由特性区分开) - 查看
Views/WebImages目录下的文件,有没有命名为Index.cshtml.cs的视图代码后置类,这类文件如果不小心被错误注册,可能会被识别成端点 - 检查项目的路由配置,是不是同时启用了控制器路由和某种文件路由规则,导致系统同时匹配到了控制器action和视图文件
内容的提问来源于stack exchange,提问作者Waller

