مشكلة تعريض أنواع واجهة مجمع مخصصة في خدمات WCF

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

  •  09-09-2019
  •  | 
  •  

سؤال

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

سواءما قمت بتضمين الواجهة في كل من التطبيقات بشكل منفصل، أو حددها كمجموعة مشتركة، أحصل على نفس النتيجة: اتصالات مع الرسالة "حدث خطأ أثناء القراءة من الأنبوب: خطأ غير معروف 109".

الواجهة تبدو وكأنها هذه:

[ServiceContract]
public interface IBase {
    int IntTest {
        [OperationContract]
        get;
    }
    String StringTest {
        [OperationContract]
        get;
    }
    IOther OtherTest {
        [OperationContract]
        get;
    }
}

[ServiceContract]
public interface IOther {
    String StringTest {
        [OperationContract]
        get;
    }
}

خادم بلدي يشبه هذا:

public partial class MainWindow : Window {
    private Base fb;
    private ServiceHost host;

    public MainWindow() {
        InitializeComponent();
        fb = new Base();
        host = new ServiceHost(fb, new Uri[] { new Uri("net.pipe://localhost") });
        host.AddServiceEndpoint(typeof(IBase), new NetNamedPipeBinding(),
            "PipeReverse");
        host.Open();
    }

    private void Window_Closing(object sender, CancelEventArgs e) {
        host.Close();
    }
}

وهنا تطبيقي للواجهة:

[Serializable]
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
public class Base : MarshalByRefObject, IBase {
    public int IntTest {
        get { return 4; }
    }

    public string StringTest {
        get { return "A string from Base"; }
    }

    public IOther OtherTest {
        get { return new Other(); }
    }
}

[Serializable]
[DataContract]
public class Other : MarshalByRefObject, IOther {
    [DataMember]
    public string StringTest {
        get { return "A string from Other"; }
    }

}

يبدو العميل مثل هذا:

public partial class Form1 : Form {

    IBase obj;

    public Form1() {
        InitializeComponent();
        ChannelFactory<IBase> pipeFactory = new ChannelFactory<IBase>(
            new NetNamedPipeBinding(), new EndpointAddress(
            "net.pipe://localhost/PipeReverse"));

        obj = pipeFactory.CreateChannel();
    }


    private void button2_Click(object sender, EventArgs e) {

        Console.WriteLine("Returns: " + obj.StringTest + " " + 
            obj.StringTest.Length);
        Console.WriteLine("Returns: " + obj.IntTest);
        Console.WriteLine(obj.OtherTest);

    }
}

كل شيء يعمل مثل سحر باستثناء هذا الخط:

Console.WriteLine(obj.OtherTest);

تعطيني اتصالات مع الرسالة "حدث خطأ في القراءة من الأنبوب: خطأ غير معروف 109". بقدر ما أستطيع أن أقول أن أنابيب مكسورة بسبب حالة مخيبة ولكن لا يمكنني معرفة السبب، أو أكثر أهمية كيفية إصلاحه. أيه أفكار؟

ليس لدي أي ملف تكوين كإظهار في التعليمات البرمجية أعلاه لذلك لا أعرف كيفية تشغيل التتبع، وإلا فسوف أدرج ذلك أيضا.

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

المحلول

الممتلكات التي تم إرجاعها غير متلازمة يحتاج إلى أن يكون نوعا ملموسا وليس واجهة، وإلا فلن يعمل التسلسل.

نصائح أخرى

هذا هو عادة خطأ التسلسل. إلقاء نظرة على السمة [nearnalpe]. أسهل طريقة لاختبار ذلك هو استدعاء DataConctractSerializer مباشرة. يمكنك استخدام طرق تداخلها وقراءةها للحصول على أخطاء التسلسل الحقيقية. يمكنك أيضا فحص الدفق (FileStream عادة) للتأكد من كتابة التسلسل بشكل صحيح.

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