Как вернуть список службы WCF определенного типа - PullRequest
0 голосов
/ 01 ноября 2019

Я определил контракт данных следующим образом:

[DataContract]
public class TestResult
{
    [DataMember]
    public string[] NegResponses { get; set; }

    [DataMember]
    public bool Pass { get; set; }

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

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

Можно ли вернуть список вышеуказанного типа в контракте на операции следующим образом:

    [OperationContract]
    [FaultContract(typeof(TestFault))]
    List<TestResult> Tester(string nodeCaption);

И чтоеще я должен посмотреть, чтобы вернуть список типа, который был определен?

Кстати, я предполагаю, что я не использую svcutil и вместо этого использую фабрику каналов следующим образом:

        private static readonly ITestService TestClient;

        // initialize a channel factory
        var channelFactory = new ChannelFactory<ITestService>(new NetTcpBinding(SecurityMode.None), endPoint);

        // Create a channel
        TestClient = channelFactory.CreateChannel();

1 Ответ

0 голосов
/ 06 ноября 2019

На стороне клиента и на стороне сервера должны использоваться один и тот же контракт на обслуживание и контракт на передачу данных. Это фундаментально, чтобы мы могли использовать сервис на стороне клиента. Вот пример, желаю, чтобы он был вам полезен.
На стороне сервера.

class Program
    {
        static void Main(string[] args)
        {
            Uri uri = new Uri("http://localhost:21011");
            BasicHttpBinding binding = new BasicHttpBinding();
            using (ServiceHost sh = new ServiceHost(typeof(MyService), uri))
            {
                sh.AddServiceEndpoint(typeof(IService), binding, "");
                ServiceMetadataBehavior smb;
                smb = sh.Description.Behaviors.Find<ServiceMetadataBehavior>();
                if (smb == null)
                {
                    smb = new ServiceMetadataBehavior()
                    {
                        HttpGetEnabled=true
                    };
                    sh.Description.Behaviors.Add(smb);
                }
                Binding mexbinding = MetadataExchangeBindings.CreateMexHttpBinding();
                sh.AddServiceEndpoint(typeof(IMetadataExchange), mexbinding, "mex");

                sh.Opened += delegate
                {
                    Console.WriteLine("Service is ready");
                };
                sh.Closed += delegate
                {
                    Console.WriteLine("Service is clsoed");
                };
                sh.Open();
                Console.ReadLine();
                //pause
                sh.Close();
                Console.ReadLine();
            }
        }
    }
    [ServiceContract]
    public interface IService
    {
        [OperationContract]
        List<Product> SayHello();
    }
    public class MyService : IService
    {
        public List<Product> SayHello()
        {
            return new List<Product>()
            {
                new Product()
                {
                    ID=1,
                    Name="Apple"
                },
                new Product()
                {
                    ID=2,
                    Name="Pear"
                }
            };
        }
    }

    [DataContract(Namespace = "MyNamespace")]
    public class Product
    {
        [DataMember]
        public int ID { get; set; }
        [DataMember]
        public string Name { get; set; }
}

На стороне клиента (Консольное приложение, мы вызываем сервис с помощью ChannelFactory).

class Program
    {
        static void Main(string[] args)
        {
            BasicHttpBinding binding = new BasicHttpBinding();
            Uri uri = new Uri("http://10.157.13.69:21011");
            ChannelFactory<IService> factory = new ChannelFactory<IService>(binding, new EndpointAddress(uri));
            IService service = factory.CreateChannel();
            try
            {
                var result = service.SayHello();
                foreach (var item in result)
                {
                    Console.WriteLine($"ID:{item.ID}\n,Name:{item.Name}");
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
    }
    [ServiceContract]
    public interface IService
    {
        [OperationContract]
        List<Product> SayHello();
    }
    [DataContract(Namespace = "MyNamespace")]
    public class Product
    {
        [DataMember]
        public int ID { get; set; }
        [DataMember]
        public string Name { get; set; }
}

Контракт с данными должен быть украшен свойством Namespace, это гарантирует, что сериализация и десериализация будут выполняться правильно). На самом деле, контракту на обслуживание также необходимо пространство имен для представления практического имени метода, которое будет использоваться для адресации метода на стороне сервера. но в пространстве имен есть значение по умолчанию.

http://tempuri.org

Не стесняйтесь, дайте мне знать, если есть что-то, с чем я могу помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...