ASP.Net MVC 应用程序在进行 Web API 调用时抛出 403 错误

ASP.Net MVC application throws 403 error while making a Web API call

我有一个 MVC 应用程序有这个问题,该应用程序具有 class 从 ApiController:

[Authorize]
public class WidgetController : ApiController
{
    // POST: api/Widget/GetWidgets
    [HttpPost]
    [ActionName("GetWidgets")]
    public List<WidgetItem> GetWidgets(WidgetQueryParams parms)
    {
        // ...
    }

    // ...
}

这是在WebApiConfig.cs中配置的:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Filters.Add(new ExceptionHandlingAttribute());

        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "WidgetApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new {id = RouteParameter.Optional }
        );

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new {id = RouteParameter.Optional }
        );
    }
}

该方法是从 JavaScript 调用的,构建于 AngularJS 之上:

function () {
    'use strict';

    angular.module('WidgetApp').factory('DataContext', ['$http', '$q', DataContext]);

    function DataContext($http, $q) {
        var service = {
            // ...
            WebAPIPostWithData: WebAPIPostWithData,
            // ...
        };
        return service;
    
        function WebApiPostWithData(Controller, Action, data) {
            var url = "api/" + Controller + "/" + Action;
            var deferred = $q.defer();

            $http.post(url, data)
                .success(function (httpResult) {
                    deferred.resuilve(httpResult);
                }).error(response) {
                    deferred.reject(response);
                    throw "Exception: DataContext/WebAPIPostWithData - Error while calling the url '" + url + "'. Message: " + response.ExceptionMessage;
                })
            return deferred.promise;
        }
    }
})();

在 运行 时间,JavaScript 进入 DataContext.WebAPIPostWithData() 并调用 $http.post()。当调用 returns 时,我看到代码停在我放在 .error() 函数上的断点处,响应是 403 错误。作为实验,我修改了 WidgetController 中的代码,因此 GetWidgets() 方法被修饰为 [HttpGet] 方法而不是 [HttpPost] 并且程序在该方法中的断点处停止.

此时我完全不知所措。为什么调用 return 在作为 HTTP POST 操作调用时出现 403 错误,但在作为 HTTP GET 操作调用时却工作正常?有没有人知道什么地方可能出了问题?

也许您有权从 API 中读取但不能写入?

可能是 CORS pre-flight 检查错误。 GET 请求没有这些限制,但是 POST 请求有。 With pre-flight 检查错误,它通常是这样说的。你能检查它是否适用于邮递员吗?如果它在 Postman 中有效,但在您的应用中无效,则表明这是一个 pre-flight 检查问题。

您可能会发现以下答案也很有用: