WCF,请教一下数据契约

dvf4r4t 2015-10-23 06:54:38
一个包含Person类的Dll,客户端和服务端都引用了这个Dll:

namespace Models
{
public class Person
{
public string UserName { get; set; }
}
}

服务契约:

namespace Contracts
{
[ServiceContract]
public interface IService
{
[OperationContract]
string DoSomething(Person p);
}
}

服务实现:

namespace Services
{
public class MyService : IService
{
public string DoSomething(Person p)
{
return p.UserName;
}
}
}

客户端:

private void Button_Click(object sender, RoutedEventArgs e)
{
ServiceClient client = new ServiceClient();
Person P = new Person() { UserName = "张三"};
MessageBox.Show(client.DoSomething(P));
}

在上面的代码中,Person类被放在一个服务端和客户端都引用了的Dll中,但是在Person类上并没有设置DataContract特性,也就是说并没有把Person当成数据契约,而最终使用上也没有任何问题,Person对象也能正常传输。
弱弱地问一句:使不使用DataContract特性,数不数据契约,又有什么不同呢?
...全文
140 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ajianchina 2015-10-24
  • 打赏
  • 举报
回复
楼主的每一个问题的答案在MSDN中都可以找到答案,并且是很容易找到,昨天我还记得给楼主一个关于数据协定的连接看的。 我把你的例子稍加调整:

namespace Models
{
    public class Person
    {
        public string UserName { get; set; }
        public ABC abc { get; set; }
    }
}

public class ABC
{
    public string a{ get; set; }
    public int b{ get; set; };
}
//其他的不写了,就上面的你可以贴进去试试。
原因很简单,Person类中原先只有一个string的属性,他是属于“有效的数据协定类”,但现在给我加进去一个ABC类,这是个自定义类型,并且我没有将DataContract应用于该类,这下明白DataContract的作用了吧?看红字就知道了。
  • 打赏
  • 举报
回复
理论上可以,但自动推算这东西并不一定如你想的那么好,你可以认为它是wcf做的一种兼容,如果可以,还是按照规定的来做,而且这功能貌似也就高版本的wcf才具备
dvf4r4t 2015-10-23
  • 打赏
  • 举报
回复
引用 4 楼 starfd 的回复:
wcf有个功能叫自动推算,就是你操作契约用到了那个实体,但你即没加datacontract,也没加serxxxx那个特性,也会认为这是数据契约
再弱问一句:既然WCF能自动推算,那我就一直采取添加Models命名空间的方式,不加DataContract.......行?
  • 打赏
  • 举报
回复
wcf有个功能叫自动推算,就是你操作契约用到了那个实体,但你即没加datacontract,也没加serxxxx那个特性,也会认为这是数据契约
dvf4r4t 2015-10-23
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
你应该看看你的代码
Person P = new Person() { UserName = "张三"};

这里的Person类型的根本就是 ServiceClient 所在的同一个命名空间中的那个 Person 类,而根本不是 Models 命名空间中的 Person 类!


不是啊,是 Models 命名空间中的 Person 啊
  • 打赏
  • 举报
回复
另外,你所谓的“Person类被放在一个服务端和客户端都引用了的Dll中”这个大概你搞得画蛇添足了。客户端的Person类型,不需要你引用什么自己的dll,客户端代理会自动生成Person类。你应该看看你的代码
Person P = new Person() { UserName = "张三"};
这里的Person类型的根本就是 ServiceClient 所在的同一个命名空间中的那个 Person 类,而根本不是 Models 命名空间中的 Person 类!
  • 打赏
  • 举报
回复
你的 ServiceContract 中的 OperationContract 使用到了一个数据类型,它还傻到不知道这个类型是数据契约啊?还用你特意去声明啊?

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧