仅WCF服务返回基类

时间:2018-05-01 18:13:23

标签: c# wcf

我正在处理WCF服务并尝试清理代码。我遇到的问题是我有一个我希望作为服务结果发送给客户端的基本数据类型;但是在服务代码本身中,它主要使用在基础上派生的类以及用于处理的附加属性。客户没有理由知道这些。

现在我可以使用它,但前提是我在共享库中定义派生类。我不希望他们在那里,因为他们只针对服务。

下面是显示问题的示例。所有这三个文件都位于同一解决方案中的单独项目中。

Common.IPersonService.cs

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

namespace Common
{
    [ServiceContract]
    public interface IPersonService
    {
        [OperationContract(Name = "GetPersonById")]        
        Person GetPersonById(int id);
    }

    [DataContract(Name = "Person")]
    public class Person
    {
        [DataMember]
        public int Id { get; set; }

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

WcfClient.Program.cs

using System;
using System.ServiceModel;
using Common;

namespace WcfClient
{
    class Program
    {
        static void Main(string[] args)
        {
            var binding = new NetTcpBinding();
            var endpoint = new EndpointAddress("net.tcp://localhost:8001/WcfTest/");
            var factory = new ChannelFactory<IPersonService>(binding, endpoint);

            IPersonService service = null;

            try
            {
                service = factory.CreateChannel();

                Person result = service.GetPersonById(5);
                Console.WriteLine(result.Name);

                ((ICommunicationObject)service).Close();

                Console.ReadLine();
            }
            catch(Exception ex)
            {                
                Console.WriteLine(ex.Message);
                Console.ReadLine();
            }
        }
    }
}

WcfService.Program.cs

using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Description;
using Common;

namespace WcfService
{
    [DataContract(Name = "Person")]
    public class Contact : Person
    {
        public string Address { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            using (ServiceHost serviceHost = new ServiceHost(typeof(PersonService)))
            {
                serviceHost.Open();

                Console.WriteLine("Service started");
                Console.ReadLine();
            }
        }
    }

    public class PersonService : IPersonService
    {

        private Dictionary<int, Contact> _testData = new Dictionary<int, Contact>();

        public PersonService()
        {
            Random rnd = new Random();

            for (int i = 0; i < 100; i++)
            {
                _testData.Add(i + 1, new Contact()
                {
                    Id = i + 1,
                    Name = Guid.NewGuid().ToString(),
                    Address = Guid.NewGuid().ToString()
                });
            }
        }

        public static void Configure(ServiceConfiguration config)
        {
            config.AddServiceEndpoint(typeof(IPersonService), new NetTcpBinding(), "net.tcp://localhost:8001/WcfTest/");

            config.Description.Behaviors.Add(new ServiceDebugBehavior { IncludeExceptionDetailInFaults = true });
        }

        public Person GetPersonById(int id)
        {
            return _testData[id];
        }

        public Person GetValueByKey(string key)
        {
            return null;
        }
    }
}

收到的例外情况如下:

  

套接字连接已中止。这可能是由错误引起的   处理您的消息或超过接收超时   远程主机或底层网络资源问题。本地套接字   超时是&#39; 00:59.9780000&#39;。

现在,如果我从WcfService项目移动Contact类并将其放在Common项目中,它将起作用。如上所述,虽然我不想使用特定于服务实现的项目混淆公共库。

谢谢!

0 个答案:

没有答案