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 检查问题。
您可能会发现以下答案也很有用:
我有一个 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 检查问题。
您可能会发现以下答案也很有用: