גישה לדומיין אחר JS
-
אני מפעיל קובץ html מסייר הקבצים (לא לוקל הוסט)
ויש בתוכו GET:
$.ajax({ url: 'http://localhost:51342/ApiHotel.svc/GetAll/0', header: 'Access-Control-Allow-Origin: *', type: "GET", dataType: "json", success: function (data) { console.dir(data), alert("Data from Server" + JSON.stringify(data)); }, error: function (jqXHR, textStatus, errorThrown) { alert("You can not send Cross Domain AJAX requests: " + errorThrown); } });
אני מקבל את השגיאה הבאה:
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.אם אני משנה ל dataType :jsonp,
אז אין את השגיאה הזו, אלא אני מקבל שגיאה אחרת על המסך: errorThrown: query 525662_6322623 was not called
למה זה קורה אחרי שהוספתי:
header: 'Access-Control-Allow-Origin: *',תודה רבה לעוזרים
פורסם במקור בפורום CODE613 ב28/01/2016 22:47 (+02:00)
-
כבר דנו בזה בעבר פה - חפש cors בפורום
הטעות שלך היא שאתה צריך להחזיר את הheader הזה מהשרת ולא לשלוח אותו, לזה שאתה שולח אותו אין שום משמעות.
התורה על רגל אחת:
כשאתה שולח בקשה מהקוד שלך לכתובת שאינה הכתובת של הדף כלומר איננה שייכת לך, הדפדפן מוודא שהבעלים של התוכן ההוא מאשר לך להציג את התוכן שלו אצלך.
בשביל לשאול אותו את זה הדפדפן שולח קודם בקשת http ב method שנקרא options ומקבל מהשרת תשובה האם ואיפה להרשות את תצוגת התוכן, אם השרת לא החזיר header כזה בכלל זה אומר שהוא לא מרשה לאף אחד, וממילא הדפדפן חוסם את הקריאה, אם החזיר עם כוכבית אז הוא מרשה לכולם ואפשר כמובן לאפשר כתובת ספציפית עם ובלי wildcards.
אם אתה בעל השרת אתה צריך לגרום לשרת שלך להחזיר את ה header עם התשובה המתאימה ואיך לבצע את זה כבר תלוי בפלטפורמה של השרת.
Jsonp "עובד" על הדפדפן בכך שהוא משתמש בפירצה שהדפדפן כן יודע לטעון קבצי סקריפט ממקורות זרים ומביא קטע קוד שבעצם מביא בסוף את הdata אבל זה דורש response במבנה מסוים ולכן אם השרת לא שלך זה לא עוזר.אפשר כמובן בצורה סיבובית לשלוח בקשה לשרת שלך ושם לבצע את הבקשה לשרת הזר ולהחזיר את המידע אליך לדף אבל אז ה request הוא מה ip שלך וזה יותר מאובטח כי בעצם המטרה של כל זה שלא יוכלו לתקוף את האתר שלך דרך דפדפנים של משתמשים תמימים.
לסיום, מכיוון שהפונקציונאליות הזו היא ברמת דפדפן אז יש תוספים שגורמים לדפדפן כן להציג הכל על ידי התערבות בresponse והוספת header כרצונך, כמובן שברוב המקרים אתה לא יכול לבקש מכל מי שיגלוש לאתר שלך שיתקין את התוסף לדפדפן שלו. חפש cors בחנויות התוספים.
פורסם במקור בפורום CODE613 ב28/01/2016 23:51 (+02:00)
-
@יאן גולד
אם אתה בעל השרת אתה צריך לגרום לשרת שלך להחזיר את ה header עם התשובה המתאימה ואיך לבצע את זה כבר תלוי בפלטפורמה של השרת.
השרת שלי הוא שירות WCF. איפה אני צריך להגדיר שהוא ישלח header?
חפש נא בגוגל
WCF custom header
ומתאים לך בעצם יותר ספציפי
WCF Access-Control-Allow-Origin.תראה שאפשר להוסיף גלובלי בapp.config, אם כי במקרים מסויימים זה מהוה "מחדל בטחוני" :).
פורסם במקור בפורום CODE613 ב31/01/2016 19:21 (+02:00)
-
על פי ה app.config שציינת לי מצאתי את זה:
http://stackoverflow.com/questions/20079813/how-to-make-cors-authentication-in-webapi-2
אני לא יודע אם זה כלול במחדל הבטחוני אבל זה קצר ולענין
עכשיו GET אחד עובד מצוין ובשני אני מקבל:
XMLHttpRequest cannot load file:///C:/ApiHotel.svc/GetReservations. Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https, chrome-extension-resource.
לא ברור לי עדיין מה ההבדל ביניהם, אם אתה מבין מהנ"ל ממה זה נגרם זה יעזור לי מאוד
פורסם במקור בפורום CODE613 ב31/01/2016 20:49 (+02:00)
-
אני מנחש שבאחד הכתובת יחסית (/ApiHotel.svc/GetAll/0) ובשני מוחלטת (http://localhost:51342/ApiHotel.svc/GetAll/0). צודק?
שאלת פה כמה שאלות לאחרונה, הצד השווה שבכולם שאתה ממוקד פתרון, ולא "בקטע" של ללמוד איך עובד ומה עושה מה.
זה מקשה עלי לענות כי יש לי תחושה שאין לך את הסבלנות ללמוד ולקרוא את התשובות, אני טועה?אבחן את סבלנותך בשאלות:
א. מה מטרת הפרוייקט? לימוד או לקוח וא"כ מה בגדול הוא צריך/דורש?
ב. למה אתה פותח את דף הHTM ישירות מהתיקיה, וכי אתה תשלח את הדף הזה ללקוחות? למה אתה לא פותח ע"י הרצת הVS כמו "ילד טוב ירושלים"?בהצלחה רבה, אשמח להיות לך לעזר ולהחכימך ומקוה שיהיה לך את הפנאי לכך.
פורסם במקור בפורום CODE613 ב01/02/2016 17:11 (+02:00)