سؤال

لدي تطبيق Silverlight 2 beta 2 الذي يصل إلى خدمة ويب WCF.ولهذا السبب، يمكنه حاليًا استخدام ربط basicHttp فقط.ستعيد خدمة الويب كميات كبيرة إلى حد ما من بيانات XML.يبدو هذا إسرافًا إلى حد ما من وجهة نظر استخدام النطاق الترددي حيث أن الاستجابة، إذا كانت مضغوطة، ستكون أصغر بعامل 5 (لقد قمت بالفعل بلصق الاستجابة في ملف txt وقمت بضغطها.).

يحتوي الطلب على "قبول ترميز:gzip، deflate" - هل هناك أي طريقة للحصول على الاستجابة gzip لخدمة WCF (أو ضغطها بطريقة أخرى)؟

لقد وجدت هذا وصلة ولكن من المؤكد أن الأمر يبدو معقدًا بعض الشيء بالنسبة للوظائف التي يجب التعامل معها خارج الصندوق (IMHO).

حسنًا - في البداية قمت بوضع علامة على الحل باستخدام System.IO.Compression كإجابة لأنني لم "أبدو" أبدًا لتشغيل الضغط الديناميكي IIS7.حسنا، كما اتضح:

  1. الضغط الديناميكي على IIS7 كان العمل على طول.كل ما في الأمر هو أن البرنامج المساعد لـ Web Developer Helper الخاص بـ Nikhil لـ IE لم يُظهر أنه يعمل.أعتقد أنه نظرًا لأن SL يقوم بإيقاف استدعاء خدمة الويب إلى المتصفح، فإن المتصفح يتعامل معها "تحت الأغطية" ولا ترى أداة Nikhil الاستجابة المضغوطة أبدًا.لقد تمكنت من تأكيد ذلك باستخدام Fiddler الذي يراقب حركة المرور خارج تطبيق المتصفح.في لعبة عازف الكمان، كان الرد في الواقع مضغوطًا بصيغة gzip!!

  2. المشكلة الأخرى في حل System.IO.Compression هي أن System.IO.Compression غير موجود في Silverlight CLR.

لذا، من وجهة نظري، فإن أسهل طريقة لتمكين ضغط WCF في Silverlight هي تمكين الضغط الديناميكي في IIS7 وعدم كتابة أي تعليمات برمجية على الإطلاق.

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

المحلول

إذا كنت تستخدم IIS7، قم بإلقاء نظرة على وحدة الضغط.يتيح لك هذا تكوين الضغط لطلبات HTTP إلى الخادم الخاص بك.

نصائح أخرى

يتيح لك WS-Compression for WCF تكوين الضغط على الرابط.

يرى ضغط WS لـ WCF بواسطة بابلو م.سيبرارو

وبدلاً من ذلك، جرب Microsoft نموذج تشفير GZip الذي "ينشئ قناة تشفير تستخدم فئة System.IO.Compression.GZipStream لضغط رسائل WCF الصادرة"

لم أر طريقة أصلية لـ WCF للقيام بالضغط عند القيام بمشروع WCF مؤخرًا.لقد استخدمت للتو مساحة الاسم System.IO.Compression وقمت بإنشاء ضاغط سريع.هذا هو الرمز الذي استخدمته

public static class CompressedSerializer
{
    /// <summary>
    /// Decompresses the specified compressed data.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="compressedData">The compressed data.</param>
    /// <returns></returns>
    public static T Decompress<T>(byte[] compressedData) where T : class
    {
        T result = null;
        using (MemoryStream memory = new MemoryStream())
        {
            memory.Write(compressedData, 0, compressedData.Length);
            memory.Position = 0L;

            using (GZipStream zip= new GZipStream(memory, CompressionMode.Decompress, true))
            {
                zip.Flush();
                var formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                result = formatter.Deserialize(zip) as T;
            }
        }

        return result;
    }

    /// <summary>
    /// Compresses the specified data.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="data">The data.</param>
    /// <returns></returns>
    public static byte[] Compress<T>(T data)
    {
        byte[] result = null;
        using (MemoryStream memory = new MemoryStream())
        {
            using (GZipStream zip= new GZipStream(memory, CompressionMode.Compress, true))
            {
                var formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                formatter.Serialize(zip, data);
            }

            result = memory.ToArray();
        }

        return result;
    }
}

ثم طلبت من خدماتي أن تأخذ مصفوفة بايت كمدخل، مثل هذا

void ReceiveData(byte[] data);

عملت بشكل جيد بالنسبة لي.

وتجدر الإشارة أيضًا إلى أنك قد تحتاج إلى إضافة نوع التمثيل الصامت إليه applicationHost.config تحت <httpCompression><dynamicTypes> القسم بالإضافة إلى تمكين الضغط للموقع:

<add mimeType="application/soap+msbin1" enabled="true" />

إذا لم يتم ضغط بعض الاستجابات الديناميكية (وبعضها كذلك)، فمن الممكن أن تكون مشكلة في نوع التمثيل الصامت.استخدم Fiddler للحصول على التفاصيل المرتبطة بالطلب.قد يكون تتبع الطلب الفاشل مفيدًا في تحديد ما إذا كان IIS يحاول ضغط الاستجابة أم لا.إذا تم تكوين الضغط بشكل صحيح فسوف ترى NO_MATCHING_CONTENT_TYPE في ال تتبع كامل قسم من إخراج التتبع.

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