当我从自定义POST操作发出POST请求时,我正在使用angular $ resource服务并遇到一种奇怪的情况。删除newDb变量(见下文)确实发布了Web API的帖子,但数据作为null传递给Web API。
这是我的Web API控制器:
var azMongo = angular.module('azMongo', ['services', 'ngResource']);
// ------------------- controllers ------------------------------ \\
azMongo
.controller('ListCtrl', ['$scope', 'dbFactory',
function ($scope, dbFactory) {
$scope.id = '2';
$scope.newDbName = 'new name';
dbFactory.getDb({ id: $scope.id }).$promise.then(function(db) {$scope.db = db;});
dbFactory.getDBs().$promise.then(function (dbs) { $scope.dbs = dbs;});
$scope.addDb = function () {
var newDb = new dbFactory({ id: 4, name: $scope.newDbName });
dbFactory.saveDb(newDb, function (response) {
alert(JSON.stringify(response));
},
function(error) {
alert(JSON.stringify(error));
});
};
}
]);
// ------------------- factories ------------------------------ \\
var services = angular.module('services', ['ngResource']);
services
.factory('dbFactory', ['$resource',
function ($resource) {
return $resource(
'http://localhost:62820/api/mongodb/:id',
{},
{
getDBs: { method: 'GET', isArray: true },
getDb: { method: 'GET' },
saveDb: {
method: 'POST',
url: 'http://localhost:62820/api/mongodb',
params: {},
headers: { 'Content-Type': 'application/json; charset=UTF-8' }
},
updateDb: {method: 'PUT', url: 'http://localhost:62820/api/mongodb'}
}
);
}
]);
以下是角度控制器和工厂:
dbFactory.saveDb(function (response) {...}
正如我所提到的,行:
dbFactory.saveDb(newDb, function (response) {...}
确实有效,但没有将日期传递给Web API,并试图像这样传递它:
{
"data":"",
"status":404,
"config":{
"transformRequest":[
null
],
"transformResponse":[
null
],
"method":"POST",
"url":"http://localhost:62820/api/mongodb",
"headers":{
"Content-Type":"application/json; charset=UTF-8",
"Accept":"application/json, text/plain, */*"
},
"data":{
"id":4,
"name":"new name"
}
}
}
从错误函数中得到以下结果:
{"Message":"The requested resource does not support http method 'OPTIONS'."}
Fiddler拦截电话并报告{{1}},并将内容类型显示为text / html。
我错过了什么?
答案 0 :(得分:0)
我花了几天的时间把头靠在我的桌子上,直到找到解决办法。只需向控制器添加另一种方法:
[AcceptVerbs("OPTIONS")]
public HttpResponseMessage Options()
{
return new HttpResponseMessage(HttpStatusCode.OK);
}
因此请求首先进入Options方法,因为它返回OK,之后会调用正确的PUT或POST方法。
我希望这篇文章可以帮助有同样问题的人。