如何从WCF服务返回带有Object属性的Object?

时间:2009-08-12 09:11:05

标签: c# wcf web-services

我有一组Web服务方法返回一个包含以下属性的ActionResult类:

object returnValue
bool success
string message

returnValue用于保存不同类型的返回值,具体取决于所使用的Web方法。

我在客户端遇到的问题是,如果一个web方法在returnValue中返回一个内部类,我无法转换它,因为客户端无法识别该类型。

我可以让fejk方法能够公开我需要的类“问题”。

例如:

Issue ExposeIssueType()
{
    return null;
}

但是,还有其他办法吗?

4 个答案:

答案 0 :(得分:1)

在等待你的评论回答时,我会告诉你这是一个非常糟糕的网络服务设计。每个Web服务操作都应返回它要返回的数据。创建一个可以保存所有可能返回值的类是没有意义的。

此外,您不应使用字符串消息从Web服务返回错误。 SOAP协议具有用于此目的的“SOAP Fault”机制。

由于您正在使用WCF,因此您完全支持SOAP Faults。例如:

在服务合同中:

[FaultContract(typeof(GeneralFault))]
[OperationContract]
int Divide(int a, int b);

在服务中:

public int Divide(int a, int b)
{
    if (b == 0)
    {
        throw new FaultException<GeneralFault>(
            new GeneralFault {Message = "Attempt to divide by zero"});
    }

    return a / b; // Note - operation can focus on its job
}

故障中返回的数据的数据合同:

[DataContract]
public class GeneralFault
{
    [DataMember]
    public string Message {get;set;}
}

答案 1 :(得分:0)

在共享DLL中创建您的类型(将其标记为Serializable),引用线的两侧。

答案 2 :(得分:0)

拥有object值对于网络服务来说绝不是一个好主意;当你只有xml(或类似的)时,它怎么能有机会?

您可能尝试使用多个子类进行一些偷偷摸摸的技巧;但不确定这是不是一个好主意。

答案 3 :(得分:0)

您不能在web方法签名中使用对象,因为它不像您想象的那样只是序列化。你可以做的是使用泛型类型:

public class ActionResult<T>
{
  public T returnValue
  public bool success
  public string message
}

然后您的网络方法应该返回ActionResult<Issue>


要解决注释的问题和(不合理!) - 1,运行并调用。

    [WebMethod]
    public object example()
    {
        return new foo
               {
                   bar = "bar",
                   baz = "baz"
               };
    }

    public class foo
    {
        public string bar { get; set; }
        public string baz { get; set; }
    }

结果:

  

System.InvalidOperationException:   生成XML时出错   文献。 ---&GT;   System.InvalidOperationException:The   类型Test + foo不是预期的。使用   XmlInclude或SoapInclude   用于指定类型的属性   不知道静态。

换句话说,你必须指定所有可以返回的非基本类型 - 这几乎与你想要实现的内容相悖。

我已经改变了关于可串行化的原始断言。