سؤال

تم حل هذا


هذا عقد لا أستطيع الحصول عليه من مكالمة خدمة:

[DataContract]
public class myInitializationData : ClientInitializationData
{
    [DataMember]
    public Dictionary<string, string> CultureNameLookup { get; set; }
}

هذا هو نوع الأساس ،

[DataContract]
public class ClientInitializationData
{
    [DataMember]
    public List<IServiceType> ServiceTypes { get; set; }
}

IServiceType هي واجهة. أدرك أنه لا يمكنني إرسال واجهة عبر السلك. يوجد كيان من ictityframework ، ServiceType, ، تنفيذ IServiceType واجهه المستخدم:

public partial class ServiceType : IServiceType
{
    //...
}

هدفي هو إرسال ServiceType الكيانات عبر السلك عبر myInitializationData عقد.

لقد منعت من تزيين myInitializationData أو ClientInitializationData دروس مع مجموعة معروفة من ServiceType, ، لأن هذه الفئات مشتركة (مرتبطة) بمشروع (مشاريع) Silverlight. لذلك إذا قمت بتزيين أي من هذه الفئات مع مجموعة معروفة من ServiceType, ، سيفشل الجانب (S) Silverlight في التجميع.

بدلاً من تزيين الفصول مباشرة ، قمت بتزيين عقد الخدمة مع خدمة معروفة ServiceType:

[ServiceContract]
[ServiceKnownType(typeof(ServiceType))]
public interface IService
{
    [OperationContract]
    myInitializationData InitializeClient();
}

هل يجب أن يعمل هذا؟

عند الاتصال IService.InitializeClient, ، أتلقى الخطأ التالي على العميل:

There was an error reading from the pipe: The pipe has been ended. (109, 0x6d).

لقد قمت بتمكين تصحيح الأخطاء التتبع ، لكنني لم أجد أي رسائل تتعلق بالفشل في التسلسل في تتبع العميل أو الخادم.

تتبع الخادم:

  • يتلقى رسالة على الإطلاق قناة (عمل: http://tempuri.org/iservice/initializeClient)
  • ينفذ (iservice.initializeClient)
  • من: تنفيذ (iservice.initializeClient)
  • يرسل رسالة عبر قناة (عمل: http://tempuri.org/iservice/initializeClientResponse)
  • تحذير مخطئ النظام.
  • تحذير مخطئ النظام
  • الرد على عملية ألقى استثناء (تم التخلص من مثيل ObjectContext ولم يعد من الممكن استخدامه للعمليات التي تتطلب اتصالًا.)

تتبع العميل:

  • يرسل رسالة عبر قناة (عمل: http://tempuri.org/iservice/initializeClient)
  • رمي استثناء (كان هناك خطأ في قراءة الأنبوب: لقد انتهى الأنبوب. (109 ، 0x6d).)

إذا اخترت ServiceTypes الممتلكات من ClientInitializationData Datacontract ، هذا الخطأ يختفي. لذلك أفترض أن هذا يجب أن يكون مشكلة تسلسل: الواجهة والأنواع المعروفة ، لكن WCF لا تدعي وجود أي مشكلات في التسلسل في التتبع ، ولست متأكدًا مما يعنيه التتبع في هذه الحالة.


المحلول

لم تكن هذه مشكلة معروفة. لقد كان نتيجة لتمكين التحميل الكسول تلقائيًا على سياق الكيان الذي يحدد ServiceType يكتب.

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

إن إرجاع التحميل الكسول إلى حالة معطلة في سياق EF قد حل هذه المشكلة منذ ذلك الحين.

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

المحلول

لم تكن هذه مشكلة معروفة. لقد كانت نتيجة لتمكين التحميل الكسول تلقائيًا على سياق الكيان الذي يحدد نوع serviceType.

على الرغم من عدم وجود ذكر لرسالة مفرطة أو أحجام عازلة يتم انتهاكها في التتبع (على جوانب العميل أو الخادم) ، يجب أن أفترض أن تمكين التحميل الكسول على سياق EF تسبب في DataContractSerializer ، والتي بدورها أدت إلى وجود رسم بياني ضخم (محاولة) على السلك. كان جانب الخادم ببساطة (وبشكل غامض) يخدع القناة أثناء كتابة الرسالة.

إن إرجاع التحميل الكسول إلى حالة معطلة في سياق EF قد حل هذه المشكلة منذ ذلك الحين.

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