繁体   English   中英

Razor 页面 POST 处理程序在 IIS 上返回 404

[英]Razor Pages POST handler returns 404 on IIS

我正在开发 ASP.NET Core 2.1 应用程序。 我需要通过 ajax 调用一个命名的页面处理程序。

该方法在调试/发布时可以正常工作,但一旦发布到 IIS 就会失败。

我试过的

  • 我现在使用 @page "{handler?}" 而不是将处理程序指定为查询参数
  • 我确保请求 url 是正确的,并且表单包含“__RequestVerificationToken”
  • 我已将 IIS 应用程序池 CLR 版本更改为“无托管代码”
  • 我已将 web.config 修改为如下所示:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <location path="." inheritInChildApplications="false">
        <system.webServer>
            <modules runAllManagedModulesForAllRequests="true" />
            <handlers>
                <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
            </handlers>
            <aspNetCore processPath="dotnet" arguments=".\MyApp.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
        </system.webServer>
    </location>
</configuration>

代码:

这是处理程序方法,其他页面中有类似的方法,并且 ajax 请求没有找到它们(但同样,只有在部署到 IIS 后才会发生这种情况):

[HttpPost]
public IActionResult OnPostExampleHandler([FromForm]ExampleHandlerModel model)
{
    // ...

    return new JsonResult(new { data, message });
}

这是提交时调用的 javascript 代码:

function submitForm()
{
    return $.ajax(
        {
            type: "POST",
            url: "/relativeURL/ExampleHandler",
            data: $('#ExampleHandlerForm').serialize(),
            dataType: "json",

            complete: function (res)
            {
                // do something on completion
            }
        });
}

最后这是 Html/Razor 代码,我正在使用“表单”TagHelper,它确保在表单被序列化时存在 AntiForgeryToken:

<form method="post" asp-page-handler="ExampleHandler" id="ExampleHandlerForm">

    <div class="modal-content">
        <div class="modal-header">
            <h5 class="modal-title">@Model.Details.Description</h5>
            <button type="button" class="close" data-dismiss="modal">
                <span aria-hidden="true">&times;</span>
            </button>
        </div>
        <div class="modal-body form-row">

            @* Input Fields *@

        </div>
        <div class="modal-footer">
            <button type="button" class="btn btn-secondary" data-dismiss="modal">@Lang.Operations.Close</button>
            <button type="button" onclick="submitForm();" class="btn btn-primary">@Lang.Operations.Save</button>
        </div>
    </div>

</form>

错误信息

POST http://root:port/relativeURL/ExampleHandler 404 (Not Found)
send    @   jquery.min.js:2
ajax    @   jquery.min.js:2
submitForm  @   VM106:13
onclick @   5:1

为我工作。

  1. 将 [IgnoreAntiforgeryToken(Order = 1001)] 添加到 PageModel。 即使您的项目中禁用了 AntiforgeryTokens。
  2. 从 url 的开头删除“/”,在这种情况下,浏览器将针对当前页面发出请求,因此您无需对整个路径进行硬编码。

例子:

url:'NameOfPageModel?handler=NameOfHandler'

不要忘记从处理程序名称中删除前缀 OnPost 和后缀 Async(如果存在)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM