首页 > 解决方案 > 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>

标签: c#asp.net-mvchttprequestput

解决方案


推荐阅读