【问题标题】:Sharing the same message contract for two actions为两个操作共享相同的消息合约
【发布时间】:2012-02-28 20:07:33
【问题描述】:

我的服务应该为操作 ILogging/LogMessage 解析 SOAP 请求,该操作具有“日志条目”作为 SOAP 主体内的根元素。为此,我有一个方法 LogMessage,它需要 LogMessageRequest 类型的参数。

LogMessageRequest 的 MessageContract 属性设置为 WrapperName 作为日志条目:

[MessageContract(WrapperName = "log-entry")]
public class LogMessageRequest
{
    ...
}

我还期待另一个操作 ILogging/LogException 的 SOAP 请求,其中 'log-entry' 作为 SOAP 正文中的根元素。为此,有一个方法 LogException 和一个 LogExceptionRequest 类型的参数。

这两种 SOAP 操作的区别在于,'log-entry' 中的子元素 'message' 不同(对于 LogMessage,'message' 是一个字符串,对于异常,它是一个复杂实体)。

问题: 由于 LogMessageRequest 和 LogExceptionRequest 具有相同的包装器名称(日志条目),我收到一个源自 LogException 的异常,说“日志条目已由 LogMessage 导出”。

我尝试对两者使用相同的请求类,并使用对象类型的“消息”。但这不起作用。

有什么建议吗? (顺便说一下,没有改变 SOAP 请求的范围)。

【问题讨论】:

    标签: c# wcf soap


    【解决方案1】:

    虽然可能有一种方法可以将不同的模式与一个通用接口匹配,但我建议一种更谨慎的方法:在一个服务接口上构建一个适配器以匹配另一个接口。

    这样,丑陋的东西就被隔离了,应用程序只需要使用一个服务接口。

    【讨论】:

      【解决方案2】:

      我不相信您可以使用您描述的 MessageContract/数据合同来实现这一点。您也许可以使用 XmlSerializer 属性来做到这一点,但听起来您需要在操作合同中使用 Message 类并查看消息 xml 以确定它是哪一个。您能否发布 WSDL/SOAP 定义的相关部分?

      【讨论】:

        猜你喜欢
        • 2016-06-20
        • 1970-01-01
        • 2021-12-17
        • 2016-03-10
        • 1970-01-01
        • 2011-12-05
        • 2014-10-01
        • 2010-12-14
        • 2013-12-01
        相关资源
        最近更新 更多