से अधिक सर्वर तक पहुंचने के लिए मैं एक वेब अनुप्रयोग विकसित करता हूं। क्लाइंट साइड - जावास्क्रिप्ट/टाइपस्क्रिप्ट + एंगुलरजेएस सर्वर साइड - सी # - एएसपीनेट वेब एपीआई 2 होस्ट के रूप में आईआईएस एक्सप्रेस।एचटीपी पोस्ट अनुरोध एक बार
मैंने एक व्यापक समस्या देखी जिसमें पोस्ट आवश्यकताएं एक से अधिक बार सर्वर तक पहुंच गईं। उदाहरण के लिए, एक परिदृश्य जिसमें अनुरोध कई बार भेजे जाते हैं, एक विशिष्ट फ़ोल्डर ईमेल के लिए प्रत्येक अनुरोध 3 बार भेजा जाता है। मैं नेटवर्क टैब में तीन बार भेजे गए अनुरोध को भी देखता हूं।
public class mailsService extends ImailsService{
static instance : ImailsService;
// Dictionary of folder -> emails
public Folders;
public mailsService(){
var scope = this;
myInterval = setInterval(function(){
// Making this request until getting a successful response - waiting for server to go up
scope.webService.get("url to get my own place").success(data => {
scope.myLocation = data;
scope.isLocationInit = true;
getAllMails();
window.cleanInterval(myInterval);
})
}, 3000);
}
// This function happen on it's own when running the client code.
// The service is a singleton therefore this code runs only once.
public getAllMails() {
if (!this.isLocationInit)
return;
var scope = this;
scope.webService.get("url to get all folders").then(reponse => {
var folders = response.data;
for (var i = 1; i <= folders.length; i ++){
return scope.get("url to get the mails inside specific folder").then(initMails.bind(null, i));
}});
}
public initMails (folderId : number, response){
mailsService.instance.Folders[folderId].push(response.data);
}
}
public class webService extends IwebService {
public get(url : string){
return this.$http.get(url);
}
public post(url : string, data : any){
return this.$http.post(url, data);
}
}
// Server side:
// Cross-Origin requests
[EnableCors(origins: "*", headers: "*", methods: "*")]
public class MailsController : ApiController
{
private IMailsService _mailsService;
public MailsController(IMailsService service)
{
this._mailsService = service;
}
public IHttpActionResult GetAllFolders()
{
var result = _mailsService.GetAllFolders();
if (result == null)
return BadRequest("...");
return Ok(result);
}
public IHttpActionResult GetFolderEmails(int folderId)
{
var result = _mailsService.GetFolderEmails(folderId);
if (result == null)
return BadRequest("...");
return Ok(result);
}
}
नियंत्रक फिटिंग विधि दो बार या उससे भी अधिक हिट करती है, हालांकि इसे क्लीएंड साइड कोड से केवल एक बार कहा जाता है।
क्या यह कुछ कॉन्फ़िगरेशन है? आईआईएस डरावनी चीज? मैं गंभीरता से नहीं जानता कि कहां दिखना शुरू करें।
यह असंभव है कि यह आईआईएस या सर्वर पक्ष है। मैंने पहले ऐसा कुछ देखा है और यह पता चला है कि $ http.post को कॉल करने वाले जावास्क्रिप्ट ईवेंट को क्लिक ईवेंट से दो बार जोड़ा गया था। तो जब उपयोगकर्ता क्लिक किया गया, जावास्क्रिप्ट घटना दो बार निकाल दी गई, जिसके कारण सर्वर पर दो POSTs हुईं, भले ही कोड केवल ऐसा दिखता है जैसे यह एक बार होना चाहिए। जांचने के लिए, अपने ब्राउज़र देव उपकरण के नेटवर्क टैब को देखें और देखें कि कितने नेटवर्क अनुरोध हैं। यदि दो, जावास्क्रिप्ट पर ध्यान केंद्रित करें - $ http.post लाइन को तोड़ने के लिए ब्राउज़र देव उपकरण का उपयोग करें और पुष्टि करें कि वह पंक्ति कितनी बार हिट होती है। –
कृपया जांचें कि आपका ब्राउज़र प्रीफलाइट अनुरोध कर रहा है या नहीं। :) प्रीफलाइट के बारे में और जानने के लिए कृपया यहां एक नज़र डालें [http://stackoverflow.com/questions/8685678/cors-how-do-preflight-an-httprequest) –
मैंने नेटवर्क टैब की जांच की है और अनुरोध हैं कई बार भेजा गया। क्लाइंट साइड कोड निश्चित रूप से एक बार चल रहा है, यह नहीं पता कि ऐसा होने का कारण क्या हो सकता है। –