WCF Przesłanie obiektu typu własnego

0

Cześć.

Staram się zaimplementować mechanizm WCF do przesłania obiektu klasy (w zasadzie samych property) do innego procesu.

Oto kod serwisu:

namespace server
{
    public partial class Form1 : Form
    {
        private ServiceHost host;
        private NetNamedPipeBinding pipeBind;

        public Form1()
        {
            InitializeComponent();

            host = new ServiceHost(typeof(ServerOperations),
                    new Uri[]{
                    new Uri("net.pipe://localhost")
                    });

            pipeBind = new NetNamedPipeBinding();

            host.AddServiceEndpoint(typeof(IXMLData), pipeBind, "PIPEName");

            host.Open();
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            host.Close();
        }
    }

    [ServiceContract]
    public interface IXMLData
    {
        [OperationContract]
        xmlData GetXMLData();
    }

    public class ServerOperations : IXMLData
    {
        private static xmlData data;

        public xmlData GetXMLData()
        {
            data = new xmlData();

            data.element = "SOME DATA";

            return data;
        }
    }

    [DataContract]
    public class xmlData
    {
        private static string _element;

        [DataMember]
        public string element
        {
            get { return _element; }
            set { _element = value; }
        }
    }

    
}

A tutaj kod klienta

namespace client
{


    public partial class Form1 : Form
    {
        private ChannelFactory<IXMLData> xmlDataFactory;
        private IXMLData xmlDataProxy;

        public Form1()
        {
            InitializeComponent();


        }


        private void button1_Click(object sender, EventArgs e)
        {
            xmlData data;

            xmlDataFactory = new ChannelFactory<IXMLData>(new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/PIPEName"));
            xmlDataProxy = xmlDataFactory.CreateChannel();

            data = xmlDataProxy.GetXMLData();

            MessageBox.Show(data.element);
        }
    }

    [ServiceContract]
    public interface IXMLData
    {
        [OperationContract]
        xmlData GetXMLData();
    }

    [DataContract]
    public class xmlData
    {
        private static string _element;

        [DataMember]
        public string element
        {
            get { return _element; }
            set { _element = value; }
        }
    }

Niestety metoda GetXmlData nie zwraca obiektu utworzonego po stronie servera - property element jest puste.

Możecie mnie nakierować gdzie robie błąd?

Czy nie chodzi przypadkiem o atrybut Namespace dla Datacontract? Tylko nie bardzo wiem, co tam powinno się znaleźć, URI do named pipe?

Pozdrawiam

1

tak, chodzi o namespace
nie ważne co się tam znajdzie, byleby było takie samo w obu projektach (zazwyczaj jest to url projektu, ale może być wymyślony)

zazwyczaj kontrakty tworzy się w osobnym projekcie (dll-ce) którą się daje jako referencje w obu projektach - dzięki temu nie musisz się martwić o namespace bo wcf sam rozpozna że to dokładnie ten sam kontrakt

W Twoim projekcie niestety nie ma szansy rozpoznać że to taki sam datacontract

0

zaletą wydzielenia kontraktów do wspólnego projektu jest jeszcze to że nie musisz duplikować kodu i nie musisz zmieniać kodu w kilku miejscach

0

Problem rozwiązany poprzez zdefiniowanie odpowiedniej przestrzeni nazw (widocznej dla klienta i serwisu)

DataContract(Namespace = "net.pipe://localhost/PIPEName") 

Natomiast poczytam o wspomnianych przez Ciebie kontraktach - wygląda ciekawie.

Dziękuję i pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1