我有一个具有CustObject
和DataContract
属性的测试类DataMember
。但是,当我将其返回给客户端时,所有值都是默认值。
服务方:
[DataContract]
public class CustObject
{
[DataMember (IsRequired = true)]
public int n1;
[DataMember (IsRequired = true)]
public int n2;
[DataMember]
public int val1 = 552;
[DataMember]
public int? val2 = 88;
[DataMember]
int val3 = 11;
[DataMember]
string val4 = "hello world";
public CustObject()
{
n1 = 1;
n2 = 2;
}
private int nprivate = 18;
}
public class CalculatorService : ICalculator
{
public CustObject Foo()
{
Console.WriteLine();
CustObject test = new CustObject();
Console.WriteLine("Should read that n1 = {0} and n2 = {1}", test.n1, test.n2);
return test;
}
}
[ServiceContract]
public interface ICalculator
{
[OperationContract]
CustObject Foo();
}
客户方:
public static void Main ()
{
CalculatorClient client = new CalculatorClient(
new WSHttpBinding(SecurityMode.None),
new EndpointAddress("http://localhost:8000/ServiceModelSamples/Service/CalculatorService"));
CustObject custObj = client.Foo();
Console.WriteLine(custObj.val1 + ", " + custObj.val2 + ", " + custObj.val1 + ", " + custObj.val2 + ", " +
custObj.val3 + ", " + custObj.val4);
//Step 3: Closing the client gracefully closes the connection and cleans up resources.
client.Close ();
Console.WriteLine ();
Console.WriteLine ("Press <ENTER> to terminate client.");
Console.ReadLine ();
}
}
输出只是0, 0, 0, 0, 0,
(最后一个值是一个空字符串)
我已经阅读了很多东西来试图找出这个问题。似乎即使初始化了值,xml转换也只是给每个字段一个默认值。我无法弄清楚原因。
我使用svutil来创建代理文件。
答案 0 :(得分:4)
使用生成的代理的一个问题是,通过svutil还是添加服务引用,正在更新您的服务。任何时候我发现我没有在字段中获得预期值,这是因为我在服务中更改了某些内容并且没有重新生成我的代理代码。如果重命名属性(甚至更改大小写)或更改数据类型,而不是抛出异常,则只需获取该数据类型的默认值。尝试再次运行svutil。
注意:这是我停止使用生成的代理并且现在使用ChannelFactory连接到WCF的原因之一。
答案 1 :(得分:0)
经过一整天,我找到了解决方案。这可能适用于所有使用Mono的人!非常有用的解决方案。
我正在使用Mono和svutil for Mono(至少在ubuntu上)生成正确的输出代码,除了一个特别重要的点。
自定义类的代理类必须包含在与服务中定义的实际自定义类相同的命名空间中!
对于上面的示例,在svutil生成的output.cs文件中,我不得不使用Service命名空间包围代理CustObject。
我通过在Windows中运行.NET版本的svutil并比较生成的代码文件来解决这个问题。我想说这可能是Mono的svutil中的一个错误。