繁体   English   中英

如何从WCF服务返回具有对象属性的对象?

[英]How to return an Object with an Object Property from a WCF Service?

我有一组Web服务方法,它们返回一个具有以下属性的ActionResult类:

object returnValue
bool success
string message

returnValue用于根据所使用的Web方法保存不同类型的返回值。

我在客户端上遇到的问题是,如果Web方法在returnValue中返回内部类,则由于客户端无法识别类型,我无法进行强制转换。

我可以使用一些方法来公开我需要的类“问题”。

例如:

Issue ExposeIssueType()
{
    return null;
}

但是没有其他办法了吗?

在等待您对我的评论的回答时,我将告诉您这是一个非常糟糕的Web服务设计。 每个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;}
}

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

在Web服务上,拥有object值绝不是一个好主意。 当您只有xml(或类似文件)时,它怎么有机会?

您可以使用多个子类尝试一些技巧。 不确定这是否是个好主意。

您不能在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文档时出错。 ---> System.InvalidOperationException:预期的类型为Test + foo。 使用XmlInclude或SoapInclude属性可以指定静态未知的类型。

换句话说,您必须指定所有可以返回的非原始类型,这与您要实现的目标几乎是矛盾的。

我已经更改了有关可序列化性的原始主张。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM