为什么 ASP.NET 核心路由导致 Azure 上的 HEAD 请求异常?
Why does ASP.NET Core routing result in exceptions for HEAD requests on Azure?
我在 Application Insights 中看到很多相同的异常,因为 HEAD 请求对我网站上的许多路径:
System.ArgumentException: The leading '?' must be included for a non-empty query. (Parameter 'value')
该网站是 Azure 应用服务中的 运行。当我在本地调试并使用 HEAD 请求命中那些相同的 URL 时,它 returns 405 未实现,但没有例外。可能是因为本地使用的是 Kestrel 而 Azure 使用的是 IIS?
我这样指定路线:
endpoints.MapControllerRoute(
name: "home-test",
pattern: "home/test",
defaults: new { controller = "Home", action = "Test" });
endpoints.MapControllerRoute(
name: "home-test-id",
pattern: "home/test/{id}",
defaults: new { controller = "Home", action = "Test" });
我的控制器操作如下所示:
[HttpGet]
public async Task<IActionResult> Test(string id)
解决这些异常的最佳方法是什么?
路由规则从上到下依次执行。经过我的测试,我认为你的默认路由部分不应该被修改。
代码已修改,因此它应该 运行 正常。
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute(
name: "home-test-id",
pattern: "home/test/{id}",
defaults: new { controller = "Home", action = "Index" });
});
此外,我建议你使用custom routing rules。
namespace webapi.Controllers
{
[Route("Home1")]
public class MyController:Controller
{
[Route("test/{id}")]
public string Get(int id)
{
return "id: " + id;
}
}
}
我在 Application Insights 中看到很多相同的异常,因为 HEAD 请求对我网站上的许多路径:
System.ArgumentException: The leading '?' must be included for a non-empty query. (Parameter 'value')
该网站是 Azure 应用服务中的 运行。当我在本地调试并使用 HEAD 请求命中那些相同的 URL 时,它 returns 405 未实现,但没有例外。可能是因为本地使用的是 Kestrel 而 Azure 使用的是 IIS?
我这样指定路线:
endpoints.MapControllerRoute(
name: "home-test",
pattern: "home/test",
defaults: new { controller = "Home", action = "Test" });
endpoints.MapControllerRoute(
name: "home-test-id",
pattern: "home/test/{id}",
defaults: new { controller = "Home", action = "Test" });
我的控制器操作如下所示:
[HttpGet]
public async Task<IActionResult> Test(string id)
解决这些异常的最佳方法是什么?
路由规则从上到下依次执行。经过我的测试,我认为你的默认路由部分不应该被修改。
代码已修改,因此它应该 运行 正常。
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute(
name: "home-test-id",
pattern: "home/test/{id}",
defaults: new { controller = "Home", action = "Index" });
});
此外,我建议你使用custom routing rules。
namespace webapi.Controllers
{
[Route("Home1")]
public class MyController:Controller
{
[Route("test/{id}")]
public string Get(int id)
{
return "id: " + id;
}
}
}