当从 Html 表单调用带有 HttpPost 的 ASP.NET CORE 3.1 操作时,服务器返回 405 错误 [关闭]

Posted

技术标签:

【中文标题】当从 Html 表单调用带有 HttpPost 的 ASP.NET CORE 3.1 操作时,服务器返回 405 错误 [关闭]【英文标题】:Server returns 405 error when ASP.NET CORE 3.1 Action with HttpPost called from Html Form [closed] 【发布时间】:2021-05-08 13:43:18 【问题描述】:

我有一个用ASP.NET CORE 3.1 开发的网站,一个用[HttpPost][ValidateAntiForgeryToken] 装饰的动作是从htmlForm 调用的。我的本地主机上一切正常,但是当我将其发布到服务器时,只有这种方法会出现 405 错误。 (与HttpPost 联系表格的另一种方法是可以的)

我在 fidller 中的请求标头:

我不知道为什么安全标头Allow: GET 在我的请求标头中,我的操作方法用 [HttpPost] 装饰,而在我的 HTML 表单中,方法设置为 POST。 在 *** 和网络上的其他资源中进行了大量搜索后,我完成了这些解决方案,但没有一个对我有用。

这是我的行动方法

[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();
            ));

在 Startup 类的 Configure 方法中:

app.UseCors("MyPolicy");

连我的动作方法都用[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 或任何其他服务器的配置。

【问题讨论】:

【参考方案1】:

最后,我发现问题出在 数据库中具有 NULL 值的字段之一上,我期待应用程序的开发人员出现 NUllable must have a value 异常异常页面,但我不断收到HTTP 405 错误。

在我的问题中,我写了我尝试过的所有解决方案。我看起来像 HTTP 405 错误意味着您必须使用代码检查所有内容,尤其是数据库错误和值。希望它可以帮助该功能的人。

【讨论】:

以上是关于当从 Html 表单调用带有 HttpPost 的 ASP.NET CORE 3.1 操作时,服务器返回 405 错误 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

当从一个子调用但另一个子调用时添加控件的子工作

ASP.NET JQuery,禁用表单提交按钮不调用 httpPost 操作

如何从 HTTPPOST、字典或检索表单值?

使用带有 DTO 的 HttpPost,邮递员无法调用 tht 方法

LightInject:调用 HttpPost 方法

怎么用java模拟浏览器提交html页面的表单数据