حدث خطأ أثناء الوصول إلى خدمة ويب ASP.net باستخدام JQuery - JSONP
-
10-07-2019 - |
سؤال
يرجى إلقاء نظرة على الكود أدناه ومساعدتي في معرفة الخطأ الذي أفعله في كود خدمة الويب الخاص بي.أرغب في إعداد خدمة ويب asp.net يمكن استهلاكها باستخدام JSONP.أنا أستخدم Jquery من جانب العميل للوصول إلى الموقع.حتى بعد إعداد السمات المناسبة، لا تزال خدمة الويب الخاصة بي تصدر ملف XML بسبب فشل استدعاء aynch.
خدمة ويب
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class WebService : System.Web.Services.WebService {
public WebService () {
//Uncomment the following line if using designed components
//InitializeComponent();
}
[WebMethod]
[ScriptMethod(ResponseFormat= ResponseFormat.Json, XmlSerializeString=false, UseHttpGet=true)]
public string HelloWorld(int id, string __callback) {
return __callback + "({message: 'Hello World'})";
}
}
استجابة خدمة الويب:
<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://tempuri.org/">test({message: 'Hello World'})</string>
تكوين الويب:
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
<httpHandlers>
<remove verb="*" path="*.asmx"/>
<add verb="*" path="*.asmx" validate="false"
type="System.Web.Script.Services.ScriptHandlerFactory,
System.Web.Extensions, Version=3.5.0.0,
Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add verb="*" path="*_AppService.axd" validate="false"
type="System.Web.Script.Services.ScriptHandlerFactory,
System.Web.Extensions, Version=3.5.0.0,
Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add verb="GET,HEAD" path="ScriptResource.axd"
type="System.Web.Handlers.ScriptResourceHandler,
System.Web.Extensions, Version=3.5.0.0,
Culture=neutral, PublicKeyToken=31BF3856AD364E35"
validate="false"/>
</httpHandlers>
<httpModules>
<add name="ScriptModule"
type="System.Web.Handlers.ScriptModule, System.Web.Extensions,
Version=3.5.0.0, Culture=neutral,
PublicKeyToken=31BF3856AD364E35"/>
</httpModules>
جافا سكريبت
$.ajax({
type: "GET",
contentType: "application/json; charset=utf-8",
url: "http://localhost:54404/jsonp/webservice.asmx/HelloWorld?id=2&__callback=?", //?jsonp=MatchSvcCallback
dataType: "jsonp",
data: {},
//jsonp : "MatchSvcCallback",
success: function(msg) {
alert("Inside success callback function"); // not being called
},
error: function(xhr, msg){
var response = JSON.parse(xhr.responseText);
}
});
يعمل رمز js مع معالج، لكنه يفشل في خدمة الويب بسبب استجابة XML.
المحلول
أعتقد أن المشكلة هنا هي أن jQuery لا يقوم بتعيين ملف Content-Type
رأس في طلب HTTP لـ HTTP GET عند الاستخدام $.ajax()
.يتم إرساله فقط إذا كان نوع الطلب هو "POST".ويبدو أن هذا هو الحال بالنسبة لكليهما dataType: "jsonp"
و dataType: "json"
.
لقد جربت مثالك وشاهدت تبادل الطلب/الاستجابة فيه العابث وبالتأكيد لا أرى Content-Type: application/xml; charset=UTF-8
يتم إرسالها في الرؤوس لطلبات HTTP GET.يتم إرسال الرأس في حالة استخدام HTTP POST.أعتقد أن وجود هذا الرأس يعد بمثابة إشارة إلى نظام خدمة الويب ASP.NET لتحديد ما إذا كان سيتم إرجاع استجابة بتنسيق JSON أو XML.
يبدو أنك لست الوحيد الذي يعاني من هذه المشكلة، راجع المقال التالي على موقع Elegant Code:
استدعاء خدمات ويب ASP.NET البعيدة من JQuery
يبدو أن الحل هو أحد الأمور التالية:
إستخدم
HttpModule
لحقنContent-Type: application/xml; charset=UTF-8
head في دفق الطلب كما هو موضح في المقالة أعلاه.إستخدم
HttpHandler
لنقطة النهاية كما أوضحت أنك كنت تفعل قبل استخدام خدمة ويب ASP.NET.جرب النهج القائم على صفحة Rick Strahl في المقالة التالية (وهو في الواقع
HttpHandler
على أي حال): JSONP لعمليات الاسترجاعات عبر المواقع.