حدث خطأ أثناء الوصول إلى خدمة ويب ASP.net باستخدام JQuery - JSONP

StackOverflow https://stackoverflow.com/questions/635547

سؤال

يرجى إلقاء نظرة على الكود أدناه ومساعدتي في معرفة الخطأ الذي أفعله في كود خدمة الويب الخاص بي.أرغب في إعداد خدمة ويب 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 لعمليات الاسترجاعات عبر المواقع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top