سؤال

لدي ASP.net خدمة ويب التي تستخدم تطبيق ويب والتي ترجع إما XML أو JSON البيانات إلي اعتمادا على وظيفة أسميه.هذا وقد تم العمل بشكل جيد حتى الآن, ولكن واجهتني مشكلة.كنت تريد إنشاء "تصدير" رابط على الصفحة التي سوف تحميل ملف JSON.الرابط هو مهيأ جدا ببساطة:

<a href="mywebserviceaddress/ExportFunc?itemId=2">Export This Item</a>

كما قد يتصور ، وهذا ينبغي أن التصدير في البند 2.حتى الآن جيد جدا, صحيح ؟

المشكلة هي أنه بما أنني لم يطلب على وجه التحديد أن قبول نوع محتوى JSON ، ASP.net بالتأكيد يرفض إرسال أي شيء ولكن XML ، والتي ليست مجرد مناسبة لهذا الوضع.رمز أساسا على النحو التالي:

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public Item ExportItem(int itemId)
    {
        Context.Response.AddHeader("content-disposition", "attachment; filename=export.json"); //Makes it a download

        return GetExportItem(itemId);
    }

على الرغم من تحديد ResponseFormat كما JSON, أنا دائما أعود XML إلا إذا طلب هذا الأسلوب عن طريق AJAX (باستخدام Google Web Toolkit, راجع للشغل):

    RequestBuilder builder = new RequestBuilder(RequestBuilder.POST, "mywebserviceaddress/ExportFunc");
    builder.setHeader("Content-type","application/json; charset=utf-8");
    builder.setHeader("Accepts","application/json");
    builder.sendRequest("{\"itemId\":2}", new RequestCallback(){...});

هذا عظيم لكن اياكس لن يعطيني تحميل مربع الحوار.هل هناك أي وسيلة لإجبار ASP.net أن تعيد لي سلمان ، بغض النظر عن البيانات المطلوبة ؟ ويبدو لي أن عدم وجود دليل تجاوز هذا السلوك الإجمالي تصميم الرقابة.


إجابة سريعة:

أولا اسمحوا لي أن أقول إنني أعتقد أن womp الجواب هو على الأرجح أفضل طريقة للذهاب طويلة الأجل (تحويل إلى WCF) ، ولكن deostroll قادني إلى الإجابة التي سوف تستخدم في المستقبل القريب.كما تجدر الإشارة إلى أن هذا يبدو للعمل في المقام الأول لأنني أردت فقط تحميل, قد لا تعمل بشكل جيد في جميع المواقف.في أي حال, هنا هو الرمز الذي انتهى تستخدم للحصول على نتيجة أردت:

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public void ExportItem(int itemId)
    {
        Item item = GetExportItem(itemId);            

        JavaScriptSerializer js = new JavaScriptSerializer();
        string str = js.Serialize(item);

        Context.Response.Clear();
        Context.Response.ContentType = "application/json";
        Context.Response.AddHeader("content-disposition", "attachment; filename=export.json");
        Context.Response.AddHeader("content-length", str.Length.ToString());
        Context.Response.Flush();
        Context.Response.Write(str);
    }

يرجى ملاحظة عودة نوع من الفراغ (وهو ما يعني أن WDSL سوف يكون لا فائدة منه على هذه الوظيفة).عودته الى أي شيء سوف المسمار الرد الذي يجري ناحية البناء.

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

المحلول

هنا نوعان من منتديات المواضيع للمرجع الخاص بك:

http://forums.asp.net/t/1118828.aspx

http://forums.asp.net/p/1054378/2338982.aspx#2338982

ليس لدي أي فكرة واضحة.يقولون على التركيز على تحديد نوع محتوى إلى application/json.لم أعمل مع wcf من قبل لكن أعتقد أنك يمكن أن تجعل استخدام من استجابة الكائن.

تعيين نوع المحتوى على استجابة الكائن.لا استجابة.كتابة يمر بك البيانات json كما string ثم لا استجابة.الغاية.

نصائح أخرى

Asp.net خدمات ويب المستندة الصابون خدمات ويب.أنها سوف تعود دائما XML.Ajax المكتبات جاء و ScriptMethod الاشياء قدم ، ولكن هذا لا يغير المفهوم الأساسي من ذلك.

هناك بضعة أشياء يمكنك القيام به.

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

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

فكرت فقط أن أقول هذا لأنه لم يكن ذكر سابقا...إذا كنت تستخدم WebServices مع ASP.NET 3.5, سلمان هو الافتراضي العودة الشكل.كما يأتي جنبا إلى جنب مع JSON مسلسل بحيث يمكنك التوقف عن استخدام جافاسكريبتسيرياليزير.

هذه المادة على ريك Strahl مدونة تتحدث عن كتابة بشدة التحويل يمكنك القيام به من جانب الخادم الطبقات كائنات JSON من العميل.

لقد أنجزت مؤخرا مشروع استخدام هذا الجديد سلمان الأشياء .NET framework 3.5 و أنا معجب جدا مع الأداء.ربما الأمر يستحق نظرة...

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