我有一个简单的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通信存在缺陷?
答案 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);
}