为两个操作共享同一消息约定

本文关键字:共享 消息 约定 操作 两个 | 更新日期: 2023-09-27 18:26:07

我的服务应该解析操作ILogging/LogMessage的SOAP请求,该操作在SOAP主体中具有"log entry"作为根元素。为此,我有一个方法LogMessage,它需要LogMessageRequest类型的参数。

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

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

我还期待着另一个SOAP请求,请求在SOAP主体中使用"log entry"作为根元素的操作ILogging/LogException。为此,有一个方法LogException和一个类型为LogExceptionRequest的参数。

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

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

我尝试对两者使用相同的请求类,并具有对象类型的"message"。但这种做法行不通。

有指针吗?(顺便说一下,没有更改SOAP请求的范围)。

为两个操作共享同一消息约定

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

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

根据您的描述,我不相信您可以使用MessageContract/data contract来实现这一点。您可能可以使用XmlSerializer属性来执行此操作,但听起来您需要使用操作约定中的Message类,并查看消息xml以确定它是哪一个。您能发布WSDL/SOAP定义的相关部分吗?