我一直在向 .NET Core 8 网站添加 API。当我在 Visual Studio 中的 IIS Express 中本地运行它时,所有 PATCH、PUT 和 DELETE 请求均有效。当我部署到服务器上的 IIS 10 时,它们被拒绝,返回 404(而不是 405)。这些请求确实记录在 IIS 日志中,更具体地说,这表明错误是 404.6(未找到 - 请求过滤模块配置为拒绝 HTTP 谓词)。
GET 和 POST 请求一如既往地成功。
我已经通过在线研究对
web.config
进行了所有可以找到的调整,但无济于事 - 删除了 WebDAV,删除并读取了 aspNetCore
和 ExtensionlessUrlHandler-Integrated-4.0
处理程序,并拼写出了完整的动词列表。我尝试添加的一项内容是 <security>
部分中的以下内容,但我将其删除,因为只要其中有任何 add
标签,该网站就不会重新启动。
<requestFiltering>
<verbs>
<add verb="GET" allowed="true" />
<add verb="HEAD" allowed="true" />
<add verb="POST" allowed="true" />
<add verb="PUT" allowed="true" />
<add verb="PATCH" allowed="true" />
<add verb="DELETE" allowed="true" />
<add verb="OPTIONS" allowed="true" />
</verbs>
</requestFiltering>
我尝试在冗余添加中的
<remove>
之前添加相应的 <add>
标签,但这没有帮助。只要 <requestFiltering>
部分为空,<verbs>
和 <verbs>
标签就不会造成任何问题。
所以这就是我剩下的。有人能想出其他方法来尝试吗?
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<location path="." inheritInChildApplications="false">
<system.web>
<httpCookies httpOnlyCookies="true" />
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule" />
</modules>
<httpProtocol>
<customHeaders>
<add name="X-Content-Type-Options" value="nosniff" />
<add name="Content-Security-Policy" value="script-src 'self' 'unsafe-hashes' 'sha256-[...]/[...]';" />
<add name="Referrer-Policy" value="same-origin" />
</customHeaders>
</httpProtocol>
<rewrite>
<outboundRules>
<rule name="Use only secure cookies" preCondition="Unsecured cookie">
<match serverVariable="RESPONSE_SET_COOKIE" pattern=".*" negate="false" />
<action type="Rewrite" value="{R:0}; secure" />
</rule>
<preConditions>
<preCondition name="Unsecured cookie">
<add input="{RESPONSE_SET_COOKIE}" pattern="." />
<add input="{RESPONSE_SET_COOKIE}" pattern="; secure" negate="true" />
</preCondition>
</preConditions>
</outboundRules>
</rewrite>
<handlers>
<remove name="WebDAV" />
<remove name="WebAdminHandler-Integrated" />
<remove name="aspNetCore" />
<add name="aspNetCore" path="*" verb="GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS" modules="AspNetCoreModuleV2" resourceType="Unspecified" requireAccess="Script" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0"
path="*."
verb="GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS"
type="System.Web.Handlers.TransferRequestHandler"
preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
<aspNetCore processPath="dotnet" arguments=".\Frb.Mispl.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess">
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
</environmentVariables>
</aspNetCore>
<security>
<authentication>
<anonymousAuthentication enabled="true" />
<windowsAuthentication enabled="false" />
</authentication>
</security>
</system.webServer>
</location>
</configuration>
我决定查看我自己计算机的 applicationHost.config(由 Visual Studio 运行的 IIS Express 使用),看看是否有任何线索,我在
<security>
部分发现,
<requestFiltering>
<verbs allowUnlisted="true" applyToWebDAV="false" />
</requestFiltering>
我将其添加到服务器上的
web.config
,我的请求开始起作用。在我回滚我尝试过的所有其他更改后,它们继续工作。