我在想这个问题。在谷歌上看了很多,自己做了一些测试,但没有。WCF DataContract只能在客户端上?是否在.NET Framework 3.5之后才真正需要?
我正在构建一些广泛使用的WCF Web服务,它将通过ASMX服务引用从.NET 2.0客户端调用,一些较新的.NET 4.5.2客户端认为WCF服务引用(是的,我让它们可以通过改变配置文件中的端点)。
经过相当多的研究,我发现的最有用的东西是THIS,它基本上说,在.NET 3.5 SP1之后,基本上不需要指定DataContract
,因为如果你不使用它,框架会照顾它, t指定它,自动为自定义类创建数据约定。缺点是您必须放弃某些高级功能和自定义设置。
这是真的,因为我试图用一些随机对象做一个.NET 4.5.2的测试项目,所有工作都很好,不需要指定数据合同。
然后我试图将项目传递给.NET 3.0和它仍然与以往的任何数据的合同工作....
而且,从我通过链接:
无[数据成员],你不能序列化非公共属性或 领域
这恰好是不正确的或者
问题是:
1)我可以在单独的项目上指定DataContract
而不是在WCF中? (示例:将DataContract
到包含的对象是客户端和web服务必须交换,并期望WCF服务要明白,该对象是否具有datacontract使用类库中的对象)
2)为什么要使用DataContract
如果即使没有必要,我也不需要花哨的东西?我可以走简单的路吗?
3)为什么如果我将项目从4.5.2转换为3.0,反之亦然WCF继续无缝工作? .NET 3.5 SP1之前不应该强制DataContract
?
4)两者都与DataContract
或不,我不断看到对象的私人领域......而指导方针说我不应该......什么?
我真的需要第一个答案。
这是我用来做测试
类库与自定义对象的项目的代码。这在WCF和一个WinForms测试客户端
public class MyTestObjs
{
public class TestObject1
{
public string Test1 { get; private set; }
public List<int> Test2 { get; private set; }
private TestObject2 Test3 { get; set; }
public TestObject1()
{
this.Test1 = "HELLO " + new Random().Next(2333);
this.Test2 = new List<int> { 1, 2, 3, 43, 544, 64 };
this.Test3 = new TestObject2();
}
}
private class TestObject2
{
public string Test1 { get; private set; }
public List<int> Test2 { get; private set; }
public TestObject2()
{
this.Test1 = "YYYYYYYY " + new Random().Next(2333);
this.Test2 = new List<int> { 1111, 2222, 3333, 4443, 55544, 64344 };
}
}
}
WCF服务引用公开的方法:
public string ReturnComplexTest1(ComplexObjTest.MyTestObjs.TestObject1 test)
{
string result = String.Empty;
result += test.Test1 + "_____";
foreach (int x in test.Test2)
{
result += x.ToString() + " - ";
}
return result;
}
public ComplexObjTest.MyTestObjs.TestObject1 ReturnComplexTest1Obj()
{
return new ComplexObjTest.MyTestObjs.TestObject1();
}
的WinForms测试客户端与服务参考
public string ReturnComplexTest1(ComplexObjTest.MyTestObjs.TestObject1 test)
{
string result = String.Empty;
result += test.Test1 + "_____";
foreach (int x in test.Test2)
{
result += x.ToString() + " - ";
}
return result;
}
public ComplexObjTest.MyTestObjs.TestObject1 ReturnComplexTest1Obj()
{
return new ComplexObjTest.MyTestObjs.TestObject1();
}
你可以从与调试见设置为.NET 3.0框架,任何地点代码中没有DATACONTRACTS的所有项目,这是结果:
我没有'需要指定任何datacontract,我可以看到私人领域......这听起来不对,但它在4.5.2和3.0 NET框架中完美运行bot。我错过了什么?
如果对象是由客户端(和服务)引用的一个单独的程序,然后在客户端(和服务)可以看到私有成员和它的领域,但他们不会被*序列*当物体进入通过电线。只有公众成员才会。 – Tim
1)好的 2)去点nr。 4) 3)所以这是IIS框架设置?这怎么可能?我明确指出我想使用3.0。 IIS是否接管并使用自己的框架设置运行3.0代码? 4)其实我可以打电话给私人会员也来自wcf测试客户端 –
@Tim这是个玩笑?你的意思是webservice只在本地以这种方式工作?当我把它放在网络上时,它将无法工作? –