繁体   English   中英

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 }
        );
    }
}

该方法是从建立在 AngularJS 之上的 JavaScript 调用的:

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() 当调用返回时,我看到代码在我放在.error() function 上的断点处停止,响应是 403 错误。 作为实验,我修改了WidgetController中的代码,因此GetWidgets()方法被修饰为[HttpGet]方法而不是[HttpPost]并且程序在该方法的断点处停止。

在这一点上我完全不知所措。 为什么调用作为 HTTP POST 操作调用时返回 403 错误,但在作为 HTTP GET 操作调用时工作正常? 有没有人对可能出什么问题有任何想法?

可能是 CORS 飞行前检查错误。 GET请求没有这些限制,但是POST请求有。 对于飞行前检查错误,它通常会这样说。 你能检查一下它在 Postman 中是否有效吗? 如果它在 Postman 中有效,但在您的应用中无效,则表明这是飞行前检查问题。

您可能会发现以下答案也很有用: Response for preflight 403 forbidden

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM