Avatar billede CodingJoe Nybegynder
22. november 2013 - 22:26 Der er 2 kommentarer og
1 løsning

Brug af ChannelFactory med WCF, kan ikke se et custom objekt

Pkt.1
Jeg har lavet en simpel WCF service. Blot udstillet den template service, der er tilstede, når man opretter en Service.svc.

Den ser ser således ud:

    using System;

    public class Service : IService
    {
        public string GetData(int value)
        {
            return string.Format("You entered: {0}", value);
        }

        public CompositeType GetDataUsingDataContract(CompositeType composite)
        {
            if (composite == null)
            {
                throw new ArgumentNullException("composite");
            }
            if (composite.BoolValue)
            {
                composite.StringValue += "Suffix";
            }
            return composite;
        }
    }

Det tilhørende interface:
    using System.Runtime.Serialization;
    using System.ServiceModel;

    [ServiceContract]
    public interface IService
    {
        [OperationContract]
        string GetData(int value);

        [OperationContract]
        CompositeType GetDataUsingDataContract(CompositeType composite);
    }

    [DataContract]
    public class CompositeType
    {
        [DataMember]
        public bool BoolValue { get; set; }

        [DataMember]
        public string StringValue { get; set; }
    }

Pkt.2
Jeg har lavet følgende klient.

    using System.ServiceModel;

    class Program
    {
        static void Main(string[] args)
        {
            var binding = new BasicHttpBinding();
            var endpoint = new EndpointAddress("http://localhost:52250/Service.svc");
            var client = ChannelFactory<IService>.CreateChannel(binding, endpoint);

            var data = client.GetData(500);
            var result = client.GetDataUsingDataContract(new CompositeType { BoolValue = true, StringValue = "XXX" });
        }
    }

Hvori jeg har kopieret mit IService interface ind, så det også er tilgængeligt i dette klient projekt.

Der findes følgende ServiceClient klasse:

    using System;
    using System.ServiceModel;

    public class ServiceClient<TContract> : IDisposable where TContract : class
    {
        private TContract _client;

        public ServiceClient(string endpointName)
        {
            var f = new ChannelFactory<TContract>(endpointName);
            this._client = f.CreateChannel();
        }

        public TResult ServiceOperation<TResult>(Func<TContract, TResult> operation)
        {
            return operation(this._client);
        }

        public void ServiceOperation(Action<TContract> operation)
        {
            operation(this._client);
        }

        public void Dispose()
        {
            try
            {
                if (this._client != null)
                {
                    var channel = this._client as IClientChannel;
                    if (channel != null && channel.State == CommunicationState.Faulted)
                    {
                        channel.Abort();
                    }
                    else
                    {
                        channel.Close();
                    }               
                }
            }

            finally
            {
                this._client = null;
                GC.SuppressFinalize(this);
            }
        }
    }

Mit var data objekt får fint følgende retur: "You entered: 500", men mit var result er helt tomt. Der er false og null i svaret tilbage.
Jeg har prøvet at debugge min service, men min GetDataUsingDataContract metode bliver kaldt fint, men argumentet er tomt dvs. der står false og null i det, min service modtager.

Hvad gør jeg galt / mangler jeg :(
Avatar billede CodingJoe Nybegynder
23. november 2013 - 19:08 #1
Det drejer sig simpelthen om, dekorere ens interface med fx. følgende på serversiden:

  using System.Runtime.Serialization;
    using System.ServiceModel;

    [ServiceContractAttribute]
    public interface IService
    {
        [OperationContractAttribute]
        string GetData(int value);

        [OperationContractAttribute]
        CompositeType GetDataUsingDataContract(CompositeType composite);
    }

    [DataContractAttribute(Name = "CompositeType", Namespace = "http://schemas.datacontract.org/2004/07/AAAA")]
    public class CompositeType
    {
        [DataMemberAttribute]
        public bool BoolValue { get; set; }

        [DataMemberAttribute]
        public string StringValue { get; set; }
    }

og på klientsiden:
    using System.Runtime.Serialization;
    using System.ServiceModel;

    [ServiceContractAttribute(ConfigurationName = "IService")]
    public interface IService
    {
        [OperationContractAttribute]
        string GetData(int value);

        [OperationContractAttribute]
        CompositeType GetDataUsingDataContract(CompositeType composite);
    }

    [DataContractAttribute(Name = "CompositeType", Namespace = "http://schemas.datacontract.org/2004/07/AAAA")]
    public class CompositeType
    {
        [DataMemberAttribute]
        public bool BoolValue { get; set; }

        [DataMemberAttribute]
        public string StringValue { get; set; }
    }
Avatar billede CodingJoe Nybegynder
23. november 2013 - 19:09 #2
svar
Avatar billede CodingJoe Nybegynder
23. november 2013 - 19:19 #3
Faktisk kan jeg se, at jeg gik udenom/slet ikke bruger min service client klasse, hvilket vist ikke var meningen.

Jeg fuldfører lige eksemplet med serviceclient delen....
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester