Asp.Net Core“Web API”路由返回404未找到

3
在安装了Asp.net Core 2的Windows 7开发机上,我们所有返回数据(非视图)的API特定路由都能正常工作。
最近一位开发者在他的新Windows 10机器上设置了API。当我们在Postman或swagger中运行路由时,他只能让一个特定的GET路由工作(额外提示-恰好这是唯一不调用EntityFramework的路由)。
所有其他路由都返回404 Not Found,就像URL不存在一样。这不是我们的代码返回404,而是平台本身返回。
由于404是服务器返回的,所以没有有用的日志记录。
我还在Win Server 2016机器上部署和测试了它,并遇到了完全相同的问题。
我在这个服务器上做的最后一件事就是安装了Asp.net Core 2 SDK,但没有任何效果。
一些代码:
[Produces("application/json")]
[Route("api/v1/Signatures/Request")]
public class SignatureRequestController : ControllerBase

[HttpPost]
[Route("")]
public async Task<SignatureRequestBaseResponse> 
CreateSignatureRequestAsync([FromBody]SignatureRequest signatureRequest)

示例POST网址:

http://localhost/My.API/api/v1/signatures/request/

示例JSON请求体:

{
    "clientApplicationInstanceId" : "4318704B-7F90-4CAE-87A9-842F2925FE45",
    "facilityId" : "PT",
    "contact": "me@my.com",
    "documentInstanceGuid" : "cc46c96f-cd78-448e-a376-cb4220d49a52",
    "messageType" : "1",
    "localeId": 1,
    "field": 
                {
                    "fieldId": 45,
                    "signatureType": "4",
                    "displayName": "Short Display Name from iMed4Web",
                    "signerNameCaption": "signer name caption",
                    "signerAddressCaption": "address caption",
                    "signerCityStateZipCaption": "city state zip caption"
                },
    "documentPreviewHtml": "too long to show..."
}

请发布您的路由配置的其余部分(Startup.cs和此控制器中的属性路由)。在路由中,第一个匹配成功的路由将被执行,所以很可能存在另一个您没有意图匹配的路由。 - undefined
原来是Serilog的问题。但只在Windows Server 2016上出现。唉。 - undefined
2个回答

4

您应该在控制器方法(操作)上应用Route属性,并且还可以指定与路由关联的http动词。请查看此文档,它将帮助您。


@TheDudeAbides 你是使用默认路由和只有路由属性吗?在你的启动类中有没有mapRoutes? - undefined
使用所有属性路由进行API。有一个默认的主页控制器用于视图。我们删除了HomeController和View。现在我可以删除那个路由并查看结果。 - undefined
我认为这一定是路由匹配的问题。你能把你的Startup类中处理路由映射的代码片段粘贴在这里吗? 当一个请求到达时,路由集合会按顺序进行处理,顺序在这里很重要。 - undefined

3
这种情况发生在我使用最新的Core 3.1 Asp.Net Core Web App模板时。问题是默认的连线方式如下所示:
app.UseEndpoints(endpoints => {
    endpoints.MapRazorPages();
    endpoints.MapControllers();
});

但是,它需要变成这样:
app.UseEndpoints(endpoints => {
    endpoints.MapRazorPages();
    endpoints.MapControllers();
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}"
    );
});

前面的回答给了我启示,但为了让其他人能够更好地理解,我想发布一个更明确的回答。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接