我有一个大型WSDL文件,我需要从中生成WCF Web服务。我可以使用svcutil.exe生成一个服务,但是它没有生成我需要的东西。
我需要一个接受/返回XML的服务,而不是序列化的类型。这样做的原因是,如果传入的XML中存在错误,它将在它到达我的代码之前失败 - 我们不能拥有它。我们需要在任何序列化发生之前拦截XML。
这可能吗?
或者有没有办法可以修改生成的服务,以便我可以使用原始XML而不是派生的“消息”类型?
有效地我想要类似的东西:
XmlDocument PersonRevised(XmlDocument request);
当前代码:
[ServiceContract(Namespace = "urn:hl7-org:v3")]
public interface IPRPA_AR101202
{
[OperationContract(Name = "PersonRevised", Action = "urn:hl7-org:v3/PRPA_IN101204")]
PersonRevisedResponse PersonRevised(Message request);
}
public class PRPA_AR101202 : WCFServiceBase, IPRPA_AR101202
{
PersonRevisedResponse IPRPA_AR101202.PersonRevised(Message request)
{
PersonRevised pr = this.ParseMessage<PersonRevised>(request, HL7_XML_NAMESPACE);
PersonRevisedResult result = new PersonRevisedResult();
PersonRevisedResponse r = new PersonRevisedResponse(result);
return r;
}
}
更新
基于答案,我能够创建一个接受字符串的WCF服务,但是现在我在基于WSDL契约的已实现服务上获取null(在输入参数上);无论是字符串还是XmlDocument / XmlNode。
思想?
答案 0 :(得分:1)
我需要一个接受/返回XML而不是序列化的服务 类型
在这种情况下,您最好使用POX而不使用SOAP / WSDL。此here和here有一些资源。
原因是传入的XML中存在错误 在它碰到我的代码之前会失败 - 我们无法做到这一点。
我知道你在这里说的是什么。令人讨厌的是,任何序列化异常都会杀死通道而不是冒泡回客户端,但是,暴露服务元数据端点的整点是客户端将始终序列化在服务外部暴露的类型正确的边界,因为这是WSDL应该是什么。
有效地我想要类似于:
的东西XmlDocument PersonRevised(XmlDocument request);
毫无疑问,暴露XmlDocument类型并不等同于公开XML。公开XmlDocument不会很漂亮。
如果您完全需要完全控制反序列化,则必须将操作公开为接受string类型的参数。然后你可以用它做你想做的事。
public string PersonRevised(string request)
{
// Deserialize here...
}