سؤال

حصلت نوع من مشكلة صعبة.

أنا أعمل في مشروع نحتاج فيه للسماح بطباعة إيصالات عند تسجيل الوصول إلى موقعنا على كشك. لأسباب تتعلق برامج التشغيل والتنسيق، فأنا أستخدم أتمتة COM مع Word للتعامل مع طباعة الإيصالات. لقد لفت هذا الكود في خدمة ويب يعمل على جهاز محلي.

كانت الخطة هي وضع مكالمة مسج jQuery بسيطة في الصفحة HTML إلى عنوان URL للآلة المحلية التي تعمل بخدمة الويب. تحتوي مكالمة AJAX هذه على كائن JSON للترتيب، والذي يترشح بواسطة خدمة الويب وطباعتها. يعمل بشكل جيد إذا كنت أستخدم LocalHost، ولكن في الإنتاج، سأجري Afoul من عدم وجود قاعدة مكالمات AJAX عبر المجال.

لن يعمل وكيل لأن الرمز الذي يعمل على موقع الويب لا يمكنه الاتصال بخدمة الويب المحلية التي تعمل بخدمة الطباعة. بعد التمثال على شبكة الإنترنت، اكتشفت أن استخدام JSONP قد يكون حل لهذا ولكن لا يمكنني معرفة كيفية عملها. يفترض معظم البرامج التعليمية أنك تحاول الحصول على بعض البيانات عن بعد بدلا من مجرد نشر البيانات. تعرض خدمة الويب الطباعة باطلة.

كيف يمكنني تكوين خدمة الويب الخاصة بي (ASMX) للعمل مع JSONP وما الذي يشبه رمز مسج الخاص بي؟ حاليا يبدو شيئا مثل هذا:

function printReceipt(data) {
   $.ajax({
       type: "POST",
       url: "http://192.9.200.165/ContestWebService/Service1.asmx/PrintOrderReceiptJson",
       data: data,
       dataType: "json",
       contentType: "application/json; charset=utf-8",
       error: function(xhr, msg) { alert(xhr.statusText); }
    });
}

أي بدائل أكثر بساطة ل JSONP، أو أي حلول أخرى ممكنة، ربما لم أفكر ستكون مفيدة أيضا.

هل كانت مفيدة؟

المحلول

JSONP ببساطة يضيف script العلامة إلى head القسم وبالتالي يقتصر فقط الحصول على طلبات. من أجل تكوين خدمة Web ASMX الخاصة بك للتعامل مع JSONP، ستحتاج إلى التعامل مع التسلسل يدويا:

[WebMethod]
[ScriptMethod(UseHttpGet=true, ResponseFormat=ResponseFormat.Json)]
public string Foo()
{
    var json = new JavaScriptSerializer().Serialize(new 
    {
        Prop1 = "some property",
    });
    string jsoncallback = HttpContext.Current.Request["jsoncallback"];
    return string.Format("{0}({1})", jsoncallback, json);
}

وجانب العميل:

$.getJSON("http://192.9.200.165/ContestWebService/Service1.asmx/PrintOrderReceiptJson?jsoncallback=?",
    function(data) {
        alert(data);
    });

بديل آخر ل مكالمات AJAX المجال الصليب هي استخدام فلاش.

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