jQuery AJAX는 해서는 안 될 304개의 응답을 생성합니다.
이것은 정말 머리를 긁적이게 합니다.즉, 파이어폭스가 아닌 IE에서만 발생하기 때문에, 저는 jQuery가 효과적으로 브라우저 중립적이었습니다.저는 지난 몇 시간 동안 이것에 대해 열심히 노력했고, 적어도 무슨 일이 일어나고 있는지 확실히 했습니다.
이 jqGrid:
$("#DocumentListByPartRecordsGrid").jqGrid(
{
datatype: 'local',
colNames: ['<b>Id</b>', '<b>Document Name</b>', '<b>Document Type</b>', '<b>Effective Date</b>', '<b>Expiration Date</b>', '<b>Delete</b>'],
colModel: [
{ name: 'ASSOCIATION_ID', Index: 'ASSOCIATION_ID', resizable: true, align: 'left', hidden: true, sortable: false },
{ name: 'FILE_NAME', Index: 'FILE_NAME', resizable: true, align: 'left', sortable: false, width:'20%' },
{ name: 'DOCUMENT_TYPE', Index: 'DOCUMENT_TYPE', resizable: true, align: 'left', sortable: false, width:'20%' },
{ name: 'EFFECTIVE_DATE', Index: 'EFFECTIVE_DATE', resizable: true, align: 'left', sortable: false, width:'20%' },
{ name: 'EXPIRATION_DATE', Index: 'EXPIRATION_DATE', resizable: true, align: 'left', sortable: false, width:'20%' },
{ name: 'Delete', Index: 'Delete',resizable: true, align: 'center', sortable: false, width:'20%' },
],
rowNum: 15,
rowList: [15, 50, 100],
imgpath: '/Drm/Content/jqGrid/steel/images',
viewrecords: true,
height: 162,
loadui: 'block',
forceFit: true
});
다음 기능으로 채워짐:
var mydata = '';
<% if(!string.IsNullOrEmpty(Model.PCAssociatedDocuments)) { %>
var mydata = <%= Model.PCAssociatedDocuments %>;
<% } %>
for (var i = 0; i <= mydata.length; i++){
jQuery("#DocumentListByPartRecordsGrid").addRowData(i, mydata[i], "last");
}
모델에서 깨끗하게 채워집니다.이것은 문제가 아닙니다.이 문제는 다음과 같이 컨트롤러에서 포맷된 삭제 기능을 사용할 때 발생합니다.
<a class='deleteAttachment' style='cursor: pointer;' href='#' onclick='javascript:PCDocumentDelete(" + s.AssociationId.ToString() + ", " + pcId + ");'>Delete</a>
그리고 이 함수를 호출합니다.
function PCDocumentDelete(id, pcid) {
if (confirm("Are you sure you want to delete this document?")) {
$.blockUI({
message: "Working...",
css: {
background: '#e7f2f7',
padding: 10
}
});
$.ajax(
{
url: '/DRM/Pc/DeleteAssociation?associationId=' + id + '&pcid=' + pcid,
async: true,
dataType: "json",
success: function(result) {
if (result.Success == true) {
//Reload grid
$.ajax({ async: false });
$("#DocumentListByPartRecordsGrid").setGridParam({ url: "/Drm/Pc/DeAssociatePartRecordsWithDocument?pcid=" + pcid, datatype: 'json', myType: 'GET', page: 1 });
$("#DocumentListByPartRecordsGrid").trigger("reloadGrid");
$.unblockUI();
$.showGlobalMessage('Specified document has been successfully disassociated from this part record.');
}
else {
$.unblockUI();
$.showGlobalMessage('An error occurred deleting the attachment.');
}
},
error: function(res, stat) {
alert(res.toString());
alert(stat.toString());
}
});
return false;
}
else {
return false;
}
}
(showGlobalMessage는 특정 형식의 블록을 만드는 내부 함수입니다.UI)
Ajax는 컨트롤러에 메서드를 다시 호출하지만, 문제는 우리가 그렇게까지 만들기 전에 발생합니다. 그래서 누군가가 중요하게 생각하지 않는 한, 저는 그 코드를 게시하지 않을 것입니다.종종 설명할 수 없는 이유로 인해 PC/Delete Association을 호출하는 Ajax의 첫 번째 버스트가 304(수정되지 않음) 응답으로 반환됩니다.새로 고쳐야 할 변경 사항이 없을 때 이 문제가 발생한다는 것을 알고 있습니다.하지만 이것은 get이 아닙니다. 게시물로 취급되어야 합니다. 그리고 저는 jquery.ajax가 특별한 지시가 없는 한 304개의 응답을 생성하지 않도록 설계되었다는 인상을 받았습니다.저는 분명히 여기서 무언가를 놓치고 있고 저 자신이 그것을 잡기에는 너무 오랫동안 그것을 응시해 왔습니다.제가 뭘 놓쳤는지 보신 분?감사해요.
나는 볼 수 없습니다. 당신은 아약스 요청을 POST로 지정하고 있습니다.기본적으로 다음을 추가합니다.
$.ajax({ type: 'POST' });
하면 (일부 브라우저 AJAX) AJAX에서 (AJAX에서), AJAX에서 설정해 볼 수 .cache: false:
$.ajax({ type: 'POST', cache: false });
Btw, 모든 캐시: false dos는 요청 URL에 일부 임의 항목을 추가하고 있습니다.
EDIT1:
에 대해서는
그리고 저는 jquery.ajax가 특별한 지시가 없는 한 304개의 응답을 생성하지 않도록 설계되었다는 인상을 받았습니다.
jQuery에서 응답이 생성되지 않습니다.그리고 304 헤더는 HTTP 헤더에 불과합니다.HTTP AJAX 요청은 일반 HTTP 요청이며 유효한 헤더를 반환할 수 있습니다.서버가 304로 응답하는 경우, XHR 오브젝트는 서버에서 로컬로 캐시된 응답을 제공합니다.하지만 사용자에게는 완전히 투명합니다.
EDIT2:
캐싱 방지에 대한 조언을 제거했습니다.부두교처럼 보여요
EDIT3:
분명히 필요했기 때문에 비트를 다시 추가했습니다.웹을 둘러보니 IE가 AJAX POST를 어느 정도 불법 캐싱하고 있는 것 같습니다.
- GET가 아닌 상태를 수정하는 메서드에 대한 호출에는 항상 POST를 사용합니다.이 경우 IE가 요청을 캐싱하지 못하도록 하려면 이 정도면 충분합니다.
- IE는 Ajax 요청을 적극적으로 캐시합니다(http://www.dashbay.com/2011/05/internet-explorer-caches-ajax/ 및 https://blog.httpwatch.com/2009/08/07/ajax-caching-two-important-facts/) 참조).이를 방지하려면 다음을 수행합니다.
- 캐시 버스트 매개 변수 추가
($.ajaxSetup({ cache: false });자동으로 이 작업을 수행합니다. - 항상 POST 요청을 사용하십시오(대부분의 경우 적합하지 않을 수 있음).
- AJAX 요청 서버 측에 대해 캐시 헤더를 설정합니다.첫 번째 링크는 그루비를 사용하여 이 작업을 수행하는 방법을 보여줍니다.유사한 방법이 모든 프레임워크에 적용되어야 합니다.
- 캐시 버스트 매개 변수 추가
캐시 버스팅이 해결책입니다!
이 경우 응용 프로그램은 브라우저를 서버의 개인 부분으로 연결하기 위해 사용자 지정 헤더가 있는 단일 서비스 호출을 프록시로 사용했습니다(모든 호출은 동일한 URL로 갔지만 사용자 지정 헤더를 사용하여 프록시 서비스에 전달할 서비스를 알려줍니다).Chrome과 FF에서는 모든 것이 잘 작동했지만 IE는 페이지의 첫 번째 통화에서 계속 데이터를 반환했습니다.jQuery.ajax의 cache=false 옵션은 IE가 호출되는 동일한 URL을 보고, 사용자 지정 헤더가 사용되는지, 심지어는 다른 데이터가 본문에 전달되는지조차 신경 쓰지 않고 "오, 이거 알아요.그리고 첫 번째 전화의 응답을 돌려주었습니다.캐시 버스팅 기술을 사용하면 URL이 IE와 다르게 보여 전송됩니다.
언급URL : https://stackoverflow.com/questions/5502002/jquery-ajax-producing-304-responses-when-it-shouldnt
'codememo' 카테고리의 다른 글
| Spring WebSocket @SendToSession: 특정 세션으로 메시지 보내기 (0) | 2023.08.26 |
|---|---|
| 도커와 도커 구성의 차이점은 무엇입니까? (0) | 2023.08.26 |
| Angular 5 반응형 - 라디오 버튼 그룹 (0) | 2023.08.26 |
| 왜 스위프트에서 레트인 프로토콜을 사용할 수 없습니까? (0) | 2023.08.26 |
| 'rxjs-compat/Observable' 모듈을 찾을 수 없습니다. (0) | 2023.08.26 |