【问题标题】:Web Api Service HTTP status code 405 on method POST方法 POST 上的 Web Api 服务 HTTP 状态代码 405
【发布时间】:2018-04-17 02:17:36
【问题描述】:

GET 工作正常。 但是在使用 POST 方法的 Chrome 中,我有: 加载资源失败:服务器响应状态为 405(不允许方法)。 无法加载 http://localhost:49834/api/Rest/:预检响应包含无效的 HTTP 状态代码 405。 在 InterntExplorer 我有: SCRIPT7002: XMLHttpRequest: Network error 0x80070005, Access denied.

控制器:

[EnableCors("*", "*", "*")]
    public class RestController : ApiController
    {
// POST: api/Rest
        [HttpPost]
        public void Post([FromBody]Request Request)
        {
            if (ModelState.IsValid)
            {
                db.Requests.Add(Request);
                db.SaveChanges();
            }
        }
}

WebApiConfig.cs

config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
            var json = config.Formatters.JsonFormatter;
            json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
            config.Formatters.Remove(config.Formatters.XmlFormatter);

Web.config:

<httpProtocol>
     <customHeaders>
       <add name="Access-Control-Allow-Origin" value="*" />
      <add name="Access-Control-Allow-Headers" value="*" />
      <add name="Access-Control-Allow-Methods" value="GET,POST,PUT,DELETE,OPTIONS" />
     </customHeaders>
   </httpProtocol>
<system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule"/> <!-- add this -->
    </modules>  
    <handlers>      
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="WebDAV" />
      <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,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers> 
</system.webServer>

AJAX 发布:

var url = "http://localhost:49834/";
$.ajax({
                type: "POST",
                url: url + "api/Rest/",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                data: JSON.stringify(submitData),
                success: function (data) {
                },
                error: function (err) {
                    console.log(err);
                    alert(err.status + " - " + err.statusText);
                }
            })

我使用 IIS Express:%userprofile%\documents\IISExpress\config 文件夹中的 applicationHost.config 文件 => ExtensionlessUrl-Integrated-4.0 处理程序配置如下 verb="GET,HEAD,POST,DEBUG,PUT,DELETE"

GET 工作正常:

$.getJSON(url + "api/Rest").done(function (data) { 
                    var mass = new Array();                 
                    $(data).each(function (index, e) {
                        ReqArray.push(e);
                    })
                    vm.requests(ReqArray); 
                });

【问题讨论】:

    标签: c# asp.net ajax post asp.net-web-api


    【解决方案1】:

    我的 ajax 出了点问题,像这样效果很好:

    var url = "http://localhost:49834/";
        $.ajax({
                            type: "POST",
                            url: url + "api/Rest",
                            dataType: "json",
                            data: submitData,
                            success: function (data) {
                            },
                            error: function (err) {
                                console.log(err);
                                alert(err.status + " - " + err.statusText);
                            }
                        })
    

    【讨论】:

    • 您自己指出了错误很好,但同样重要的是要知道为什么会这样 - 您创建的“API”在调用它时期望“HTTP”动词为“POST”,否则它会返回405(方法不允许)。默认情况下,“getJSON”方法使用“GET”“HTTP”动词发送请求,并通过“ajax”方法显式传递动词解决了您的问题。干杯!!!
    猜你喜欢
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 2023-03-29
    • 2021-05-21
    • 2015-03-29
    • 1970-01-01
    相关资源
    最近更新 更多