加载资源失败:服务器从 Angularjs 响应状态为 405(不允许方法)到 WebApi

Posted

技术标签:

【中文标题】加载资源失败:服务器从 Angularjs 响应状态为 405(不允许方法)到 WebApi【英文标题】:Failed to load resource: the server responded with a status of 405 (Method Not Allowed) from Angularjs to WebApi 【发布时间】:2017-10-19 01:44:57 【问题描述】:

我正在使用 AngularJS 调用我的 webAPI 并出现以下错误...

Failed to load resource: the server responded with a status of 405 (Method Not Allowed) http://localhost:52240/api/PcpEnvironment/
XMLHttpRequest cannot load http://localhost:52240/api/PcpEnvironment/. Invalid HTTP status code 405 

这是我对 webapi 的调用...

    angular.module('PcPortal')

.controller('UpdateEnvironmentController', UpdateEnvironmentController);

UpdateEnvironmentController.$inject = ['$scope', '$http', '$rootScope'];

function UpdateEnvironmentController($scope, $rootScope, $http) 

    $scope.selectedEnv = $rootScope.selectedEnv;

    $scope.updateEnv = function () 
        alert('Updating env');
        var envData = angular.toJson($rootScope.selectedEnv);

        var config = 
            method: 'POST',
            url: 'http://localhost:52240/api/PcpEnvironment/Post/',
            headers: 
                "Content-Type": "application/json"
            ,
            data:  env: envData 
        ;

        $http(config)
            .then(function successCallback(response) 
                alert(response);
            ,
                function errorCallback(response) 
                    alert('Failed: ' + response);
                );

    
;

WebApI 方法...

 [HttpPost]
        public bool Post(PcpEnvironment env)
        
            return _service.UpdateEnvironment(env);
        

在我的 webapiconfig 文件中...我在下面添加了...

System.Web.Http.GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
            config.Formatters.Insert(0, new System.Net.Http.Formatting.JsonMediaTypeFormatter());

f 我删除了一个$http ...我的绑定停止工作...对于var webadmin = angular.module('PcPortal',[]);,我有单独的引导文件来执行此操作...这里我只是获取同一个应用程序的参考。

为了让我的绑定正常工作...我需要更改输入顺序,如下所示...

UpdateEnvironmentController.$inject = ['$scope', '$http', '$rootScope'];

function UpdateEnvironmentController($scope, $rootScope, $http) 

根据建议的控制器的新定义...我遇到了错误...

TypeError: object is not a function

这个错误是因为使用 $http 来调用服务器。 可以帮助解决这里的问题。

【问题讨论】:

如果一切都是服务器端的文件,表单状态码 405(不允许方法),可能的原因可能是您的数据不正确。在配置中,您可以尝试直接将数据作为envData 传递。而不是添加env 【参考方案1】:

我找到了我的问题的答案。经过很多很多谷歌之后肯定会。

默认情况下 POST,webAPI 中不允许使用 PUT 方法。您要么需要为此使用 CORS 包,要么另一种解决方案是(我曾经解决我的问题)...

在 web.config 中添加下面的配置

<system.webServer>
     <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Content-Type" />
        <add name="Access-Control-Allow-Methods" value="GET,POST,PUT,DELETE,OPTIONS" />
        <add name="Access-Control-Allow-Credentials" value="true" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>

您还需要刷新您的 OPTIONS 请求。在 Global.aspx 文件中添加以下代码...

protected void Application_BeginRequest()
        
            if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
            
                Response.Flush();
            
        

【讨论】:

【参考方案2】:

从 $inject 中删除一个 $http

UpdateEnvironmentController.$inject = ['$scope', '$http', '$rootScope'];

另外,在模块中添加一个空方括号

var webadmin = angular.module('PcPortal',[]);

【讨论】:

如果我删除一个 $http ...我的绑定停止工作...对于 var webadmin = angular.module('PcPortal',[]);我有单独的引导文件来执行此操作...这里我只是获取同一个应用程序的参考。 然后从js中移除模块 那么我将如何将我的控制器与模块连接起来。我已经用更多细节更新了我的问题。请看一下。 只使用全局变量来引用模块 感谢您的帮助...我的问题得到了解决...***.com/questions/27504256/…【参考方案3】:

最好的方法是使用 CORS 包。 只需在 Nuget 包控制台安装包 Owin.Cors

Install-Package Microsoft.Owin.Cors 

在此之后,您需要在您的 startup.cs 中添加配置。 如下所示。

public void Configuration(IAppBuilder app)
        
            HttpConfiguration config = new HttpConfiguration();

            ConfigureOAuth(app);

            WebApiConfig.Register(config);
            app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
            app.UseWebApi(config);

        

【讨论】:

以上是关于加载资源失败:服务器从 Angularjs 响应状态为 405(不允许方法)到 WebApi的主要内容,如果未能解决你的问题,请参考以下文章

加载资源失败:服务器响应状态为 404 (Not Found) angular js + ionic

加载资源失败:服务器响应状态为 404(未找到)

Angular 5 - 加载资源失败:服务器响应状态为 404(未找到)

加载资源失败:服务器响应状态为 431 (Request Header Fields Too Large)

“加载资源失败:服务器响应状态为 404”express docker

错误:加载资源失败:服务器响应状态为 404(未找到)