سؤال

أنا خلقت الملف ASMX مع رمز خلف الملف.انها تعمل بشكل جيد, ولكن هو إخراج XML.

ومع ذلك احتاج إلى إخراج سلمان.على ResponseFormat التكوين لا يبدو أن العمل.قانون بلدي-خلف هو:

[System.Web.Script.Services.ScriptService]
public class _default : System.Web.Services.WebService {
    [WebMethod]
    [ScriptMethod(UseHttpGet = true,ResponseFormat = ResponseFormat.Json)]
    public string[] UserDetails()
    {
        return new string[] { "abc", "def" };
    }
}
هل كانت مفيدة؟

المحلول

خدمة ويب بإرجاع XML حتى عندما وضعت ResponseFormat إلى JSON :

<اقتباس فقرة>   

تأكد من أن الطلب هو طلب وظيفة، وليس GET. سكوت غوثري لها <لأ href = "http://weblogs.asp.net/scottgu/archive/2007/04/04/json-hijacking-and-how-asp-net-ajax-1-0-mitigates-these -attacks.aspx "يختلط =" نوفولو noreferrer "> آخر يفسر لماذا .

     

وعلى الرغم من انها مكتوبة خصيصا للمسج، وهذا قد يكون من المفيد لك:
   عن طريق مسج لتستهلك ASP.NET JSON خدمات الويب

نصائح أخرى

لتلقي سلسلة JSON النقية، دون أن يكون ملفوفة إلى XML، لديك لكتابة سلسلة JSON مباشرة إلى HttpResponse وتغيير نوع WebMethod العودة إلى void.

    [System.Web.Script.Services.ScriptService]
    public class WebServiceClass : System.Web.Services.WebService {
        [WebMethod]
        public void WebMethodName()
        {
            HttpContext.Current.Response.Write("{property: value}");
        }
    }

وربما هذا هو أخبار قديمة الآن ، ولكن السحر يبدو أن:

  • [ScriptService] السمة على خدمة ويب الدرجة
  • [ScriptMethod(UseHttpGet = صحيح ، ResponseFormat = ResponseFormat.Json)] على طريقة
  • نوع المحتوى:application/json في طلب

مع هذه القطع في مكان ، طلب الحصول على النجاح.

بالنسبة HTTP POST

  • [ScriptMethod(UseHttpGet = false ، ResponseFormat = ResponseFormat.Json)] على طريقة

و على جانب العميل (على افتراض لديك webmethod يسمى MethodName ، ويستغرق معلمة واحدة تسمى searchString):

        $.ajax({
            url: "MyWebService.asmx/MethodName",
            type: "POST",
            contentType: "application/json",
            data: JSON.stringify({ searchString: q }),
            success: function (response) {                  
            },
            error: function (jqXHR, textStatus, errorThrown) {
                alert(textStatus + ": " + jqXHR.responseText);
            }
        });

وهناك مسكتك السريعة التي تعلمت بالطريقة الصعبة (أساسا قضاء 4 ساعات على جوجل)، يمكنك استخدام PageMethods في ملف ASPX الخاص بك للعودة JSON (مع علامة [ScriptMethod ()]) للأسلوب ثابت، ولكن إذا كنت تقرر نقل أساليب ثابتة إلى ملف asmx، فإنه لا يمكن أن يكون أسلوب ثابت.

وأيضا، تحتاج لنقول للخدمة ويب نوع المحتوى: التطبيق / سلمان من أجل الحصول على JSON العودة من المكالمة (أنا باستخدام مسج وفي 3 أخطاء لتجنب عند استخدام مسج في والمفيدة جدا - في الفترة من نفس الموقع المذكور في إجابة أخرى هنا).

هل استدعاء خدمة ويب من برنامج العميل النصي أو على الجانب الخادم؟

وأنت قد تجد إرسال ورأس نوع المحتوى إلى خادم تساعد، على سبيل المثال

'التطبيق / سلمان. محارف = UTF-8 '

وعلى جانب العميل، وأنا استخدم مكتبة العميل النموذج، وهناك معلمة contentType عند إجراء مكالمة اياكس حيث يمكنك تحديد ذلك. أعتقد مسج لديه طريقة getJSON.

والبديل: استخدام معالج HTTP عام (.ashx) واستخدام مكتبة سلمان المفضلة لديك لتسلسل يدويا وإلغاء تسلسل JSON الخاص بك.

ولقد وجدت أن سيطرة كاملة على التعامل مع الطلب وتوليد استجابة يدق أي شيء من العروض. NET أخرى للخدمات ويب بسيطة، مريحة.

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