首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataContracts的WCF重定位

DataContracts的WCF重定位
EN

Stack Overflow用户
提问于 2009-09-15 18:48:07
回答 2查看 254关注 0票数 0

这是一个功能齐全的WCF Hello World程序。也就是说,我可以毫无例外地运行这个程序。

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace DataContractsNamespace
{
    [DataContract]
    public class AccountInfo
    {
        [DataMember]
        public string FirstName { get; set; }

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;

namespace Clients
{
    public class BankProxy : ServiceContractsNamespace.IBank
    {
        ServiceContractsNamespace.IBank channel;

        public BankProxy()
        {
            channel = ChannelFactory<ServiceContractsNamespace.IBank>.CreateChannel(new BasicHttpBinding(), new EndpointAddress("http://localhost:8000/Services/BankService"));
        }

        public decimal GetAcccountBalance(string AcctNo)
        {
           return channel.GetAcccountBalance(AcctNo);
        }

        public DataContractsNamespace.AccountInfo GetAccountInfo(string AcctNo)
        {
             return channel.GetAccountInfo(AcctNo);
        }
    }
}

using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.Text;

namespace ServiceContractsNamespace
{
    [ServiceContract]
    public interface IBank
    {
        [OperationContract]
        decimal GetAcccountBalance(string AcctNo);

        [OperationContract]
        DataContractsNamespace.AccountInfo GetAccountInfo(string AcctNo);
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Clients
{
    class Program
    {
        static void Main(string[] args)
        {
            BankProxy prox = new BankProxy();
            Console.WriteLine("Hit enter to invoke the service call. Type exit then enter to close");

            while (Console.ReadLine() != "exit")
            {
                string balance = prox.GetAcccountBalance("1234").ToString("c");
                DataContractsNamespace.AccountInfo ai = prox.GetAccountInfo("1234");
                Console.WriteLine("{0} {1} your account balance is {2}.", ai.FirstName, ai.LastName, balance);
            }
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Hosts
{
    public class BankService : ServiceContractsNamespace.IBank
    {
        public decimal GetAcccountBalance(string AcctNo)
        {
            return 1.37m;
        }

        public DataContractsNamespace.AccountInfo GetAccountInfo(string AcctNo)
        {
            DataContractsNamespace.AccountInfo ai = new DataContractsNamespace.AccountInfo();
            ai.FirstName = "Paul";
            ai.LastName = "Johansen";
            return ai;
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;

namespace Hosts
{
    class Program
    {
        static void Main(string[] args)
        {
            ServiceHost servHo = new ServiceHost(typeof(BankService), new Uri("http://localhost:8000/Services"));
            servHo.AddServiceEndpoint(typeof(ServiceContractsNamespace.IBank), new BasicHttpBinding(), "BankService");

            servHo.Open();
            Console.WriteLine("This service is open for business. Hit Enter to close.");
            Console.ReadLine();
            servHo.Close();
        }
    }
}

正如您所看到的,AccountInfo - Data contract由客户端和主机共享。

我只需要将数据合同保留到主机/服务端。

客户端应该只看到DataContracts (如IAccountInfo)的接口。

我应该如何修改我的程序以引入IAccountInfo

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-09-15 19:40:58

听起来你想要返回一个接口而不是一个类。我不太确定为什么您不满足于返回AccountInfo。但是,您应该能够做到这一点,但您需要使用KnownType或ServiceKnownType才能使其工作。

或者,如果您在完全.NET环境中工作,则可以使用NetDataContractSerializer而不是DataContractSerializer。

有关参考和示例,您可以查看:

  • http://nirajrules.wordpress.com/2009/08/26/wcf-serializers-xmlserializer-vs-datacontratserializer-vs-netdatacontractserializer/
  • http://www.pluralsight.com/community/blogs/aaron/archive/2006/04/21/22284.aspx
  • http://weblogs.asp.net/avnerk/archive/2006/07/31/WCF-Serialization-part-1_3A00_-Interfaces_2C00_-Base-classes-and-the-NetDataContractFormatSerializer.aspx
  • http://www.thoughtshapes.com/WCF/ExampleTwo.htm
票数 1
EN

Stack Overflow用户

发布于 2009-09-15 19:00:37

如果你不想共享AccountInfo,IBank.GetAccountInfo应该向客户端返回什么呢?创建2个类使第一个数据契约不是第二个,在你想要共享的地方使用第一个,如果不是,就使用第二个。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1428992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档