使用WCF通信接口和客户类

时间:2014-08-12 11:22:34

标签: c# wcf

我有一个简单的WCF服务,我希望用它来将数据从客户端发送到服务器,我不确定序列化数据的最佳方法。

我很抱歉,如果这是重复的,但我认为我使用Interfaces和客户类意味着这不是一个简单的案例。

我有一个简单的类结构......

   public interface IFoo
    {
       IBar MyBar{ get; }
       String SomeInfo{ get; }
    }

    public interface IBar
    {
       String SomeMoreInfo{ get; }
    }


    public class Foo : IFoo
    {
       private IBar _MyBar;
       private String _SomeInfo;

       public String MyBar 
       {
          get { return _MyBar; }
          private set { _MyBar = value; }
       }

       public String SomeInfo 
       {
          get { return _SomeInfo; }
          private set { _SomeInfo= value; }
       }
    }

    public class Bar : IBar
    {
       private String _SomeMoreInfo;

       public String SomeMoreInfo
       {
          get { return _SomeMoreInfo; }
          private set { _SomeMoreInfo= value; }
       }
    }

我有一个简单的WCF服务来发送这些数据......

[ServiceContract]
public interface IFooBarService 
{
    [OperationContract]
    bool SendFooBar(IFoo request);
}

public class FooBarService : IFooBarService 
{
    public bool SendFooBar(IFoo request)
    {
        throw NotImplementedException();
    }
}

我的问题是,将这些数据从客户端发送到服务器的最佳方法是什么?我应该使用属性还是DataContractResolver,或者我的类设计是否存在WCF通信存在缺陷?

2 个答案:

答案 0 :(得分:1)

通常,操作的输入参数是从客户端到服务器的数据,返回数据是从服务器到客户端的数据。

对于复杂类型,您需要定义数据合同。

当您通过Visual Studio创建新的WCF项目时,您将获得一组包含服务合同和数据合同的框架代码。你会看到你应该使用DataContract类的对象而不是接口来传递数据,并且没有明确的序列化代码,因为这是由运行时完成的。

除非您已经深入研究过WCF并且有一些边缘和复杂的情况,否则您不需要在常见的业务应用程序中使用DataContractResolver。

互联网上有很多WCF教程,例如http://www.codeproject.com/Articles/627240/WCF-for-the-Real-World-Not-Hello-World

答案 1 :(得分:1)

此链接可能有所帮助:http://blogs.msdn.com/b/domgreen/archive/2009/04/13/wcf-using-interfaces-in-method-signatures.aspx

ServiceKnownType和KnownType可能是您正在寻找的朋友:(我还没有完全测试过,所以请耐心等待)

public interface IFoo
    {
    IBar MyBar { get; }
    String SomeInfo { get; }
    }

public interface IBar
    {
    String SomeMoreInfo { get; }
    }

[DataContract(Name = "Foo")]
[KnownType(typeof(IFoo))]
public class Foo : IFoo
    {
    private IBar _MyBar;
    private String _SomeInfo;

    [DataMember(Name = "MyBar")]
    public IBar MyBar
        {
        get { return _MyBar; }
        private set { _MyBar = value; }
        }

    [DataMember(Name = "SomeInfo")]
    public String SomeInfo
        {
        get { return _SomeInfo; }
        private set { _SomeInfo = value; }
        }
    }

[DataContract(Name = "Bar")]
[KnownType(typeof(IBar))]
public class Bar : IBar
    {
    private String _SomeMoreInfo;

    [DataMember(Name = "SomeMoreInfo")]
    public String SomeMoreInfo
        {
        get { return _SomeMoreInfo; }
        private set { _SomeMoreInfo = value; }
        }

    }

[ServiceContract]
public interface IFooBarService
    {
    [OperationContract]
    [ServiceKnownType(typeof(Foo))]
    [ServiceKnownType(typeof(Bar))]
    bool SendFooBar(IFoo request);
    }