【问题标题】:HTTPPost is not allowed by production WebServer for WebAPI (aspnetcore 2.2)WebAPI 的生产 WebServer 不允许 HTTPPost (aspnetcore 2.2)
【发布时间】:2019-09-11 19:05:35
【问题描述】:

我在 StartUp.ConfigureServices 中有以下代码

  services.AddCors(c=>c.AddPolicy(Konstants.CORS, d=>
                    d.AllowAnyHeader()
                        .AllowAnyMethod()
                        .AllowAnyOrigin()
                        .AllowCredentials()
                    )
                );

在 Configure 方法中,我使用以下内容作为第一行:

app.UseCors(Konstants.CORS);

在 web api 的每个控制器上,我使用以下内容

 [Route("api/[controller]")]
    [EnableCors(Konstants.CORS)]
    [ApiController, Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
    [Consumes("application/json"), Produces("application/json")]
    public class EmployeesController : ApiBaseController
    {

在本地机器上一切正常。但在远程机器上,即生产机器上,HTTPGet 工作正常,但对于所有 HTTPPOST,它返回 404。

这是我的 web.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath=".\myapp.Web.exe" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" />
    </system.webServer>
  </location>
</configuration>

可能是什么问题?我可以通过 plesk 访问网络服务器。 我错过了一些细节。该网站有常规控制器以及托管在同一应用程序中的 API 控制器。对于 api 控制器,我们使用 JWTToken 对于我们使用 cookie 的其他控制器。网站工作得很好。 Api 控制器的所有获取请求都可以正常工作,它们甚至可以正确地从数据库中获取数据(因此至少它不是数据库问题),但所有 api POST 返回 404。找不到 URL。

正如@Anton 所问,这里是发布请求之一

[HttpPost("Start")]
        public async Task<IActionResult> StartJob([FromBody] JobActivityModel model)
        {
            var ret = Empty;

            try
            {

                await Execute(new StartJob
                {
                    JobId = model.JobId,
                    PersonId = UserId,
                    At = model.CreatedAt
                });

                Log.Info($"{SoligoUser} has started the job");

                ret = Ok(new TimeClue
                {
                    Message = "job has been started",
                    IsSuccess = true,
                    Time = model.CreatedAt
                });
            }
            catch (Exception ex)
            {
                Log.Error(ex);
                ret = Error(ex);
            }

            return ret;
        }

【问题讨论】:

  • 你很可能会达到 500,然后如果你没有错误处理页面,它会给你一个 404。因为它发生在 POST 我假设你正在尝试写一些东西到数据库。检查数据库是否正常工作。首先启用开发人员异常页面。
  • 数据库应该可以正常工作,因为所有访问数据库的 get 请求都会正确返回数据。所以我认为它与数据库并没有真正的关系。我添加了广泛的日志记录,但甚至没有到达 API 控制器。
  • 可能值得展示一个您想要执行的操作的示例。
  • 是的,在我的问题中添加了一个发布请求,以便您查看代码。它甚至没有达到。

标签: asp.net-core asp.net-web-api http-post http-status-code-404


【解决方案1】:

您可以尝试以下方法。

  1. 安装swagger并尝试
  2. RDP 进入服务器并尝试在服务器上运行。这将给出确切的错误。
  3. 检查您尝试使用服务器的 post 请求的标头。
  4. 双重检查路径和负载是否正确
  5. 在 iis 中关注 host .net core
  6. 检查您是否向服务器发送了正确的令牌

【讨论】:

  • 我的提供商禁止 RDP 访问,他提到出于安全原因,这是不可能的。
  • 那就试试大摇大摆吧。
【解决方案2】:

在网络搜索上浪费了很多时间后,结果证明这是解决方案:

添加此行解决了所有问题。发布现在正常工作,有时遇到的媒体不支持错误也已修复。

我希望有一天编译器会告诉“嘿,你需要把这个”

【讨论】:

    猜你喜欢
    • 2019-09-22
    • 1970-01-01
    • 2019-01-16
    • 2014-10-13
    • 2021-11-30
    • 1970-01-01
    • 2016-05-06
    • 2016-12-03
    • 2019-07-02
    相关资源
    最近更新 更多