ما هو المفضل لديك طريقة إرسال البيانات المعقدة على خدمة الإنترنت ؟

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

  •  08-06-2019
  •  | 
  •  

سؤال

إنه 2008, وأنا لا تزال ممزقة على هذا واحد.حتى انا تطوير الويب الأسلوب الذي يحتاج إلى نوع معقد تمريرها إلى ذلك وعاد من ذلك.الخيارين أنا يتلاعب هي:

  1. تمر والعودة الفعلية كائنات الأعمال مع كل من البيانات والسلوك.عندما wsdl.exe يتم تشغيل, فإنه سيتم تلقائيا إنشاء وكيل الطبقات التي تحتوي على البيانات فقط جزء, و سيتم تحويلها تلقائيا إلى عملي الحقيقي الكائنات على جانب الملقم.على جانب العميل ، إلا أنها سوف تحصل على استخدام البكم وكيل نوع وأنها سوف تضطر إلى خريطة لهم في بعض الأعمال الحقيقية الأشياء على النحو الذي تراه مناسبا.عيب كبير هنا هو أنه إذا كنت "الخاصة" كل من الخادم و العميل, و أريد أن استخدام نفس مجموعة العمل الحقيقي الأشياء, أنا يمكن أن تصل إلى بعض الصداع مع اسم الصراعات ، إلخ.(لأن الأشياء الحقيقية و وكلاء اسمه نفس.)

  2. ننسى محاولة لتمرير "الحقيقي" كائنات الأعمال.بدلا من مجرد إنشاء بسيطة DataTransfer الكائنات التي سوف الخريطة ذهابا وإيابا إلى العمل الحقيقي الأشياء يدويا.فإنها لا تزال تحصل على نسخ جديدة من الكائنات الوكيل قبل wsdl.exe على أي حال, ولكن على الأقل أنا لا خداع نفسي إلى التفكير في أن خدمات ويب يمكن أصلا التعامل مع الكائنات مع منطق الأعمال في نفوسهم.

بالمناسبة هل يعرف احدكم كيفية معرفة wsdl.exe إلى لا إنشاء نسخة من الكائن ؟ ألا يجب أن تكون قادرة على مجرد "مرحبا استخدام هذه القائمة اكتب هنا.لا نسخ ذلك!"

على أي حال, لقد استقر على رقم 2 الآن, ولكن أنا الغريب ما أعتقد.لدي شعور بأن هناك طريقة أفضل الطرق للقيام بذلك في عام ، وأنا قد لا تكون دقيقة تماما في كل النقاط, لذا يرجى اسمحوا لي أن أعرف ما الخبرات الخاصة بك يكون.

التحديث:أنا فقط وجدت أن VS 2008 لديه خيار إعادة استخدام الأنواع الموجودة عند إضافة "خدمة مرجعية" بدلا من إنشاء العلامة التجارية الجديدة متطابقة اكتب في الملف الوكيل.الحلو.

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

المحلول

هناك أيضا حجة يفصل بين طبقات - مجموعة من تسلسل الكائنات التي مرت من خدمة ويب و مترجم إلى خريطة تحويل بين أن مجموعة الأعمال الكائنات (التي قد يكون لها خصائص غير مناسبة تمر فوق السلك)

لها نهج اختاره خدمة ويب مصنع البرمجيات خدمة المصنع و يعني أنه يمكنك تغيير عملك الكائنات دون كسر خدمة ويب واجهة/عقد

نصائح أخرى

سأفعل هجين.وأود أن استخدام كائن مثل هذا

public class TransferObject
{
    public string Type { get; set; }
    public byte[] Data { get; set; }
}

ثم القليل من المساعدة الذي يسلسل كائن ثم يضغط عليه.

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;
    }
}

ثم كنت مجرد تمرير نقل كائن أن يكون اسم النوع.لذلك يمكن أن تفعل شيئا مثل هذا

[WebMethod]
public void ReceiveData(TransferObject data)
{
    Type originType = Type.GetType(data.Type);
    object item = CompressedSerializer.Decompress<object>(data.Data);
}

الآن المضغوط مسلسل يستخدم الأدوية تجعل كتبته بقوة ولكن هل يمكن أن تجعل طريقة بسهولة أن تأخذ في نوع كائن إلى إلغاء تسلسل باستخدام originType أعلاه, كل هذا يتوقف على التنفيذ.

نأمل أن يكون هذا يعطيك بعض الأفكار.و الإجابة على سؤال آخر ، wsdl.exe لا يدعم إعادة استخدام أنواع رأس المال العامل لا على الرغم من.

دارين كتب:سأفعل هجين.وأود أن استخدام كائن مثل هذا...

فكرة مثيرة للاهتمام...تمرير تسلسل نسخة من الكائن بدلا من (wsdl-ed) هدف في حد ذاته.في طريقة أنا أحب الأناقة ، ولكن بطريقة أخرى ، يبدو أن هزيمة الغرض من تعريض خدمة الويب الخاص بك المحتملين الأطراف الثالثة أو الشركاء أو أيا كان.كيف يمكنهم معرفة ما يحدث ؟ فإنها تضطر إلى الاعتماد المحض على الوثائق ؟ كما يفقد بعض من "غير متجانسة العميل" الجانب منذ التسلسل جدا .صافي محددة.أنا لا أقصد أن تكون حاسمة ، أنا أتساءل فقط إذا ما تقترحه هو يعني أيضا هذه الأنواع من حالات الاستخدام.أنا لا أرى أي شيء خاطئ مع استخدامه في بيئة مغلقة على الرغم من.

يجب أن ننظر إلى صندوق رأس المال العامل...لقد تم تجنب ذلك ، ولكن ربما حان الوقت.

بالتأكيد, أنا فقط أفعل هذا وأنا المستهلك من خدمة ويب أو إذا كان لديك نوعا من تحكم يطلبون كائن من ثم يمكنك التعامل مع التسلسل وإرسال بدلا من مباشرة تستهلك خدمة ويب.ولكن في الحقيقة ، إذا فهي تستهلك مباشرة ويب, ثم أنها لن تحتاج بالضرورة أو الجمعية التي سيكون لها نوع في ذلك في المقام الأول, و يجب أن يكون استخدام الكائنات التي wsdl يولد.

و نعم ما طرح جدا .صافي محددة لأنني لا ترغب في استخدام أي شيء آخر.المرة الوحيدة التى تستهلك webservices خارج .صافي كان في جافا سكريبت, ولكن الآن أنا فقط استخدام سلمان الردود بدلا من خدمة ويب xml الردود :)

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