我正在学习WCF
。在我的客户端根据需要完成操作后,我尝试将对象从我的服务返回到客户端。但它没有给出任何错误,也没有返回结果。
public class myWCF : ImyWCF
{
public int myAddition(int IP_One, int IP_Two, out int IP_Three)
{
IP_Three = IP_One + IP_Two;
return IP_Three;
}
public MYTYPE mySubstraction()
{
MYTYPE mType = new MYTYPE();
mType.InpOne = 10;
mType.InpTwo = 20;
mType.InpThree = mType.InpTwo - mType.InpOne;
return mType;
}
}
[ServiceContract]
public interface ImyWCF
{
[OperationContract]
int myAddition(int IP_One, int IP_Two, out int IP_Three);
[OperationContract]
MYTYPE mySubstraction();
}
[DataContract]
public class myArithmatics
{
[DataMember]
public int IP_One;
[DataMember]
public int IP_Two;
[DataMember]
public int IP_Three;
}
[Serializable]
[DataContractAttribute(IsReference=true)]
public class MYTYPE
{
public int inpOne = 0;
public int inpTwo = 0;
public int inpThree = 0;
[DataMemberAttribute]
public int InpOne
{
get { return inpOne; }
set { inpOne = value; }
}
[DataMemberAttribute]
public int InpTwo
{
get { return inpTwo; }
set { inpTwo = value; }
}
[DataMemberAttribute]
public int InpThree
{
get { return inpThree; }
set { inpThree = value; }
}
}
Console.WriteLine("Service Started");
ClientMyWCF.ImyWCFClient oMYWcf = new ClientMyWCF.ImyWCFClient();
int INP_One = 10;
int INP_Two = 20;
int INP_Three = 0;
oMYWcf.myAddition(out INP_Three,INP_One,INP_Two);
Console.WriteLine("Out put from Service :"+ INP_Three.ToString());
ClientMyWCF.MYTYPE objMT = new ClientMyWCF.MYTYPE();
objMT.InpOne = 10;
objMT.InpTwo = 20;
//objMT.InpThree = 0;
oMYWcf.mySubstraction();
Console.WriteLine("Out put from Service :" + objMT.InpThree.ToString());
Console.ReadLine();
所以任何想法如何让对象返回?
答案 0 :(得分:3)
当您返回操作结果以及OUT参数时,我不确定为什么在第一次调用中使用OUT参数。
此外,在第一个方法调用(添加)中,您的参数顺序错误。 在第二个方法调用中,您没有将MYTYPE对象分配给变量。
我建议使用以下代码:
public class myWCF : ImyWCF
{
// remove the OUT parameter
public int myAddition(int IP_One, int IP_Two)
{
return IP_One + IP_Two;
}
public MYTYPE mySubstraction()
{
MYTYPE mType = new MYTYPE();
mType.InpOne = 10;
mType.InpTwo = 20;
mType.InpThree = mType.InpTwo - mType.InpOne;
return mType;
}
}
在程序代码中使用以下内容:
Console.WriteLine("Service Started");
ClientMyWCF.ImyWCFClient oMYWcf = new ClientMyWCF.ImyWCFClient();
int INP_One = 10;
int INP_Two = 20;
int INP_Three = 0;
INP_Three = oMYWcf.myAddition(INP_One, INP_Two);
Console.WriteLine("Out put from Service :"+ INP_Three.ToString());
ClientMyWCF.MYTYPE objMT = new ClientMyWCF.MYTYPE();
// Not needed - these are set in the mySubtraction method
//objMT.InpOne = 10;
//objMT.InpTwo = 20;
//objMT.InpThree = 0;
objMT = oMYWcf.mySubstraction();
Console.WriteLine("Out put from Service :" + objMT.InpThree.ToString());
Console.ReadLine();
答案 1 :(得分:2)
删除SerializableAttribute例如; [Serializable]因为不需要序列化这个对象。
这些是wcf服务的标准。
答案 2 :(得分:1)
您也可以一起删除这两个属性
[Serializable]
[DataContractAttribute(IsReference=true)]
默认情况下,所有公共属性都将被序列化。也看到你的代理会有所帮助。您应该继承某些类。我也没有看到一个新的ServiceHost实例(typeof(MyService),myUri)被初始化,这很奇怪。也许你把它封装在某个地方。无论如何,通常使用ChannelFactory构建新频道such并将新服务托管为such。
答案 3 :(得分:0)
首先,删除SerializableAttribute,使用DataContractAttribute就足够了。
为什么要在myAddition方法中使用?它已经通过返回值返回结果,第三个参数是不必要的。
在你的代码中,你没有存储mySubstraction的结果,当你读到没有赋值的objMT.InpThree时,我不明白。