美元http.获取不反映数据库更改
本文关键字:数据库 http 获取 美元 | 更新日期: 2023-09-27 18:18:48
我有一个ASP。运行AngularJS的. NET项目,它正在访问使用数据库的WCF服务。它是一个简单的CRUD接口,带有一个显示数据库数据的表,以及用于添加、编辑和删除数据的选项。在用户添加(即:$http.post
),编辑(即:$http.put
)或删除条目(即:$http.delete
)之后,我的控制器调用$http.get
并使用它来更新表。所有请求都使用"promise"结构并捕获错误。
有时在发出请求后,表不会在更改后更新。我已经检查过了,从get请求中检索到的数据不包括更改。但是,如果我重新加载页面,将显示更改。为什么会发生这种情况,为什么只是偶尔发生?在post
/put
/delete
请求和get请求之间是否需要延迟或其他东西?这是服务器问题还是客户端问题?提前感谢!
编辑1
在更新失败期间检查chrome开发工具网络中的实际请求时,我发现对创建/删除/更新服务的两个调用将在GET请求之后进行。第一个总是一个OPTIONS请求,然后是实际的POST/DELETE/PUT请求。早些时候,为了让这些服务与我的接口一起工作,我必须用以下内容修改services Global.asax.cs文件:
protected void Application_BeginRequest(object sender, EventArgs e)
{
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
{
HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
HttpContext.Current.Response.End();
}
}
问题可能在这里。什么好主意吗?
编辑2
我的控制器中的保存功能:
$scope.save = function () {
// Store user inputs
var Map = {
Id: $scope.Id,
Channel: $scope.Channel,
SubChannel: $scope.SubChannel,
ChannelStatus: $scope.ChannelStatus,
MappedStatus: $scope.MappedStatus
};
var post = CRUD_AngularJS_RESTService.post(Map);
post.then(function (pl) {
// Clear input forms
ClearModels();
$scope.ResultMessage = "New entry " + pl.data.Id + " added";
$scope.AddEntry = false;
// Re-populate table with new data
GetFullMap();
},
function (err) {
console.log("Error: ", err);
});
};
GetFullMap()是控制器中的另一个函数:
function GetFullMap() {
var get = CRUD_AngularJS_RESTService.getFullMap();
get.then(function (pl) {
console.log("here ", pl.data);
// Display map data in table
$scope.Maps = pl.data;
console.log($scope.Maps);
},
function (errorPl) {
$scope.ResultMessage = "Error loading map";
console.log("Error occurred while retrieving map ", errorPl);
});
}
在Services.js中,post函数:
// Create new record
this.post = function (Map) {
var request = $http({
method: "post",
url: "http://localhost:63647/Services.svc/rest/MapCreate",
data: Map
});
return request;
}
同样在Services中,get函数:
this.getFullMap = function () {
return $http.get("http://localhost:63647/MerchantServices.svc/rest/FullMapRead");
};
您使用的是哪种浏览器?
旧的ie版本(ie9)有一个激进的缓存策略。有时它会缓存你的get http请求…
你必须在服务器响应的头中设置一个no-cache参数,或者只是为每个请求添加一个时间戳参数(这样每个请求都是不同的)。
http://myContext/myService?时间戳= 1350387905444
不知道为什么会发生这种情况,但这个解决方案似乎解决了问题,我只是在调用GetFullMap()之前添加了一点延迟:
$scope.save = function () {
// Store user inputs
var Map = {
Id: $scope.Id,
Channel: $scope.Channel,
SubChannel: $scope.SubChannel,
ChannelStatus: $scope.ChannelStatus,
MappedStatus: $scope.MappedStatus
};
var post = CRUD_AngularJS_RESTService.post(Map);
post.then(function (pl) {
// Clear input forms
ClearModels();
$scope.ResultMessage = "New entry " + pl.data.Id + " added";
$scope.AddEntry = false;
// Re-populate table with new data
$timeout(GetFullMap, 100);
},
function (err) {
console.log("Error: ", err);
});
};
还要确保在app.controller函数中提供$timeout:
app.controller("CRUD_AngularJS_RESTController", function($scope, CRUD_AngularJS_RESTService, $timeout)
{
...
});