将 WCF Web 服务 (SOAP) 从 WSDL 生成为 accept/return XML 而不是序列化类型
Generating WCF web service (SOAP) from WSDL to accept/return XML rather than serialized types
我有一个很大的 WSDL 文件,我需要从中生成 WCF Web 服务。我可以使用 svcutil.exe 生成服务,但它没有生成我需要的内容。
我需要 accepts/returns XML 的服务,而不是序列化类型。这样做的原因是如果传入的 XML 有错误,它会在它到达我的代码之前失败——我们不能有这个。我们需要在任何序列化恰好捕获它之前拦截 XML。
这可能吗?
或者有什么方法可以修改生成的服务,以便我可以使用原始 XML 而不是派生的 "Message" 类型?
实际上我想要类似的东西:
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 合同(输入参数)的已实现服务上得到空值;不管它是字符串还是 XmlDocument/XmlNode.
想法?
I need a service that accepts/returns XML, rather than serialized
types
在这种情况下,您最好使用 POX 而根本不使用 SOAP/WSDL。 here and here 有一些资源。
The reason for this is if there is an error in the incoming XML it
will fail before it hits my code - we can't have this.
我有点知道你在说什么。令人恼火的是,任何序列化异常都会终止通道而不是冒泡回客户端,但是,暴露服务元数据端点的全部要点 是客户端将始终序列化暴露的类型正确地在服务边界之外,因为这就是 WSDL 的用途。
Effecitvely I want something similar to: XmlDocument
PersonRevised(XmlDocument request);
您肯定知道,公开 XmlDocument 类型不等同于公开 XML。公开 XmlDocument 不会很好。
如果您绝对需要完全控制反序列化,则必须将您的操作公开为接受字符串类型的参数。然后你可以用它做你想做的事。
public string PersonRevised(string request)
{
// Deserialize here...
}
我有一个很大的 WSDL 文件,我需要从中生成 WCF Web 服务。我可以使用 svcutil.exe 生成服务,但它没有生成我需要的内容。
我需要 accepts/returns XML 的服务,而不是序列化类型。这样做的原因是如果传入的 XML 有错误,它会在它到达我的代码之前失败——我们不能有这个。我们需要在任何序列化恰好捕获它之前拦截 XML。
这可能吗?
或者有什么方法可以修改生成的服务,以便我可以使用原始 XML 而不是派生的 "Message" 类型?
实际上我想要类似的东西:
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 合同(输入参数)的已实现服务上得到空值;不管它是字符串还是 XmlDocument/XmlNode.
想法?
I need a service that accepts/returns XML, rather than serialized types
在这种情况下,您最好使用 POX 而根本不使用 SOAP/WSDL。 here and here 有一些资源。
The reason for this is if there is an error in the incoming XML it will fail before it hits my code - we can't have this.
我有点知道你在说什么。令人恼火的是,任何序列化异常都会终止通道而不是冒泡回客户端,但是,暴露服务元数据端点的全部要点 是客户端将始终序列化暴露的类型正确地在服务边界之外,因为这就是 WSDL 的用途。
Effecitvely I want something similar to:
XmlDocument PersonRevised(XmlDocument request);
您肯定知道,公开 XmlDocument 类型不等同于公开 XML。公开 XmlDocument 不会很好。
如果您绝对需要完全控制反序列化,则必须将您的操作公开为接受字符串类型的参数。然后你可以用它做你想做的事。
public string PersonRevised(string request)
{
// Deserialize here...
}