当从 Html 表单调用 HttpPost 的 ASP.NET CORE 3.1 操作时服务器 returns 405 错误
Server returns 405 error when ASP.NET CORE 3.1 Action with HttpPost called from Html Form
我有一个用 ASP.NET CORE 3.1
开发的网站,一个用 [HttpPost]
和 [ValidateAntiForgeryToken]
修饰的动作从 HtmlForm 调用。在我的本地主机上一切正常,但是当我将它发布到服务器时,只有这种方法会出现 405 错误。 (另一种联系方式 HttpPost
也可以)
我在 fidller 中的请求 headers :
我不知道为什么安全性 headers Allow: GET
在我的请求 headers 中,我的操作方法用 [HttpPost] 装饰并且在我的 HTML 表单中方法设置为 POST。
在 Whosebug 和网络上的其他资源中进行大量搜索后,我完成了这些解决方案,但 none 对我有用。
这是我的操作方法
[HttpPost]
[ValidateAntiForgeryToken]
[EnableCors("MyPolicy")]
public async Task<IActionResult> Order(OrderSingleProductViewModel model) {
if(!ModelState.IsValid) {
var product = await _productService.GetResultByIdAsync(model.ProductId);
return RedirectToAction("Detail", "Post", new {
postType = PostType.PRODUCT,
slug = product.Slug
});
}
var data = model.Adapt<OrderSingleProductDto>();
//var basket = await _orderProductService.OrderProductAsync(data);
var invoice = await _orderProductService.CreateInvoiceAsync(data);
var result = invoice.Adapt<CustomerInvoiceViewModel>();
result.CurrencyTitle = WebsiteInfo.CurrencyInfo.DefaultCurrencyTitle;
var contactInfo = await _websiteOptionService.GetContactInfoAsync();
result.InvoiceInfo.Address = contactInfo.Address1;
result.InvoiceInfo.Email = contactInfo.Email;
result.InvoiceInfo.Phones = contactInfo.Phones;
var optionLogo = await _websiteOptionService
.GetOptionAsync("website.logo");
var optionCompany = await _websiteOptionService
.GetOptionAsync("company.name");
if (optionLogo != null)
result.InvoiceInfo.Logo = optionLogo.Value;
if (optionCompany != null)
result.InvoiceInfo.Company = optionCompany.Value;
return View(result);
}
启用 CORS
public void ConfigureServices(IServiceCollection services) {
services.AddCors(o => o.AddPolicy("MyPolicy", builder => {
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
}));
}
并且在启动的Configure方法中class:
app.UseCors("MyPolicy");
连我的action方法都装饰了[EnableCors("MyPolicy")]
我的 Web.config 文件:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<location path="." inheritInChildApplications="false">
<system.webServer>
<modules runAllManagedModulesForAllRequests="false">
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="aspNetCore" />
<remove name="WebDAV" />
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath=".\Felan.Web.exe" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
</system.webServer>
</location>
</configuration>
并且我的网站托管在共享主机提供商中,因此我无法访问 IIS 或任何其他服务器的配置。
最后,我发现问题出在 数据库中的一个具有 NULL 值的字段 而我期待NUllable must have a value
应用程序开发人员异常页面中的异常,但我一直收到 HTTP 405
错误。
在我的问题中,我写下了我尝试过的所有解决方案。我t 看起来像 HTTP 405 错误意味着您必须检查您的代码的所有内容,尤其是数据库错误和值。希望它对功能中的某人有所帮助。
我有一个用 ASP.NET CORE 3.1
开发的网站,一个用 [HttpPost]
和 [ValidateAntiForgeryToken]
修饰的动作从 HtmlForm 调用。在我的本地主机上一切正常,但是当我将它发布到服务器时,只有这种方法会出现 405 错误。 (另一种联系方式 HttpPost
也可以)
我在 fidller 中的请求 headers :
我不知道为什么安全性 headers Allow: GET
在我的请求 headers 中,我的操作方法用 [HttpPost] 装饰并且在我的 HTML 表单中方法设置为 POST。
在 Whosebug 和网络上的其他资源中进行大量搜索后,我完成了这些解决方案,但 none 对我有用。
这是我的操作方法
[HttpPost]
[ValidateAntiForgeryToken]
[EnableCors("MyPolicy")]
public async Task<IActionResult> Order(OrderSingleProductViewModel model) {
if(!ModelState.IsValid) {
var product = await _productService.GetResultByIdAsync(model.ProductId);
return RedirectToAction("Detail", "Post", new {
postType = PostType.PRODUCT,
slug = product.Slug
});
}
var data = model.Adapt<OrderSingleProductDto>();
//var basket = await _orderProductService.OrderProductAsync(data);
var invoice = await _orderProductService.CreateInvoiceAsync(data);
var result = invoice.Adapt<CustomerInvoiceViewModel>();
result.CurrencyTitle = WebsiteInfo.CurrencyInfo.DefaultCurrencyTitle;
var contactInfo = await _websiteOptionService.GetContactInfoAsync();
result.InvoiceInfo.Address = contactInfo.Address1;
result.InvoiceInfo.Email = contactInfo.Email;
result.InvoiceInfo.Phones = contactInfo.Phones;
var optionLogo = await _websiteOptionService
.GetOptionAsync("website.logo");
var optionCompany = await _websiteOptionService
.GetOptionAsync("company.name");
if (optionLogo != null)
result.InvoiceInfo.Logo = optionLogo.Value;
if (optionCompany != null)
result.InvoiceInfo.Company = optionCompany.Value;
return View(result);
}
启用 CORS
public void ConfigureServices(IServiceCollection services) {
services.AddCors(o => o.AddPolicy("MyPolicy", builder => {
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
}));
}
并且在启动的Configure方法中class:
app.UseCors("MyPolicy");
连我的action方法都装饰了[EnableCors("MyPolicy")]
我的 Web.config 文件:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<location path="." inheritInChildApplications="false">
<system.webServer>
<modules runAllManagedModulesForAllRequests="false">
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="aspNetCore" />
<remove name="WebDAV" />
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath=".\Felan.Web.exe" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
</system.webServer>
</location>
</configuration>
并且我的网站托管在共享主机提供商中,因此我无法访问 IIS 或任何其他服务器的配置。
最后,我发现问题出在 数据库中的一个具有 NULL 值的字段 而我期待NUllable must have a value
应用程序开发人员异常页面中的异常,但我一直收到 HTTP 405
错误。
在我的问题中,我写下了我尝试过的所有解决方案。我t 看起来像 HTTP 405 错误意味着您必须检查您的代码的所有内容,尤其是数据库错误和值。希望它对功能中的某人有所帮助。