从WCF服务返回对象

时间:2011-07-18 03:24:32

标签: wcf

我正在学习WCF。在我的客户端根据需要完成操作后,我尝试将对象从我的服务返回到客户端。但它没有给出任何错误,也没有返回结果。

Service.svc.cs

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();

所以任何想法如何让对象返回?

4 个答案:

答案 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]因为不需要序列化这个对象。

  1. 对于课程,请使用属性[DataContract]
  2. 对于类级属性,请使用属性[DataMemberAttribute]
  3. 公开方法,使用attirbute [OperationContract]
  4. 这些是wcf服务的标准。

答案 2 :(得分:1)

您也可以一起删除这两个属性

[Serializable]
[DataContractAttribute(IsReference=true)]

默认情况下,所有公共属性都将被序列化。也看到你的代理会有所帮助。您应该继承某些类。我也没有看到一个新的ServiceHost实例(typeof(MyService),myUri)被初始化,这很奇怪。也许你把它封装在某个地方。无论如何,通常使用ChannelFactory构建新频道such并将新服务托管为such

答案 3 :(得分:0)

首先,删除SerializableAttribute,使用DataContractAttribute就足够了。

为什么要在myAddition方法中使用?它已经通过返回值返回结果,第三个参数是不必要的。

在你的代码中,你没有存储mySubstraction的结果,当你读到没有赋值的objMT.InpThree时,我不明白。