c# - C#、MVC、PUT 返回 405 Method Not Alowed
问题描述
我正在尝试发送 PUT 请求,但它总是返回 405 错误。我花了一个晚上试图修复它,我想我做了web.config中设置的所有组合,试图用不同的方法修改代码,我此时感到无助。也许我想念别的东西。我对mvc很新鲜。我对 GET 使用相同的方法,它工作正常。
这是js代码:
var msg = {
name: newName,
description: newDesc
};
var stringMSG = JSON.stringify(msg);
console.log(stringMSG);
$.ajax({
type: "PUT",
url: '@Url.Action("PutSite", "Home")',
async: true,
cache: false,
data: {
id: id,
json: stringMSG
}
}).done(function (result) {
console.log(result);
});
C# 控制器:
[Authorize]
public HttpResponseMessage PutSite(string id, string json)
{
return ApiProvider.UpdateSite(GetSessionId(), id, json);
}
C# 类:
public static HttpResponseMessage UpdateSite(string sessionID, string siteID, string json)
{
var client = GetHttpClient();
var request = new HttpRequestMessage(HttpMethod.Put, $"{ApiBaseUrl}/api/session?id={sessionId}/site/{siteID}")
{
Content = new StringContent(json, Encoding.Default, "application/json")
};
return PutResponse(client, request);
}
private static HttpResponseMessage PutResponse(HttpClient client, HttpRequestMessage request)
{
var response = client.PutAsync(request.RequestUri,request.Content).Result;
return response;
}
private static HttpClient GetHttpClient()
{
var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json; charset=utf-8");
return client;
}
和 web.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<location path="." inheritInChildApplications="false">
<system.web>
<webServices>
<protocols>
<add name="HttpGet" />
<add name="HttpPost" />
</protocols>
</webServices>
</system.web>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE" />
<add name="Access-Control-Allow-Headers" value="Content-Type,Accept, expiry, uid, access-token, token-type" />
</customHeaders>
</httpProtocol>
<modules runAllManagedModulesForAllRequests="false">
<remove name="WebDAVModule" />
</modules>
<validation validateIntegratedModeConfiguration="false" />
<handlers>
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" hostingModel="InProcess">
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
<environmentVariable name="ASPNETCORE_HTTPS_PORT" value="44345" />
<environmentVariable name="COMPLUS_ForceENC" value="1" />
</environmentVariables>
</aspNetCore>
</system.webServer>
</location>
</configuration>
解决方案
推荐阅读
- javascript - Jexcel - 需要添加更改下拉列表代替最后一个 col 下拉列表
- php - 从 GAE php74 标准环境中的日志中删除“child said into stdout/stderr”前缀
- python - 在 for 循环中绘图(python)
- python - 如何使散点图轴均匀分布?
- python - 如何让 python 在运行 .py 文件时跳过某些代码块?
- c# - 使用成员身份验证和无令牌调用 WCF Rest Web 服务
- git - 为什么我的开发分支每次都让我提交合并?
- azure - 如何使用 apim 策略记录对事件中心的响应时间
- android - android.view.InflateException: Binary XML file line #0: Binary XML file line #0: Error inflating class ImageView
- google-kubernetes-engine - 无法连接到服务器:拨打 tcp 10.0.0.1:443:GKE pod 中的 i/o 超时错误