C# 从WSDL生成WCF web服务(SOAP)以接受/返回XML而不是序列化类型
我有一个大的WSDL文件,我需要从中生成WCF Web服务。我可以使用svcutil.exe生成服务,但它不会生成我需要的内容 我需要一个接受/返回XML而不是序列化类型的服务。这样做的原因是,如果传入的XML中有错误,它将在命中我的代码之前失败-我们不能这样做。我们需要在任何序列化捕获XML之前拦截它 这可能吗 或者有没有一种方法可以修改生成的服务,以便使用原始XML而不是派生的“消息”类型 有效地,我想要类似于:C# 从WSDL生成WCF web服务(SOAP)以接受/返回XML而不是序列化类型,c#,xml,web-services,wcf,soap,C#,Xml,Web Services,Wcf,Soap,我有一个大的WSDL文件,我需要从中生成WCF Web服务。我可以使用svcutil.exe生成服务,但它不会生成我需要的内容 我需要一个接受/返回XML而不是序列化类型的服务。这样做的原因是,如果传入的XML中有错误,它将在命中我的代码之前失败-我们不能这样做。我们需要在任何序列化捕获XML之前拦截它 这可能吗 或者有没有一种方法可以修改生成的服务,以便使用原始XML而不是派生的“消息”类型 有效地,我想要类似于: XmlDocument PersonRevised(XmlDocument r
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;
}
}
[ServiceContract(Namespace=“urn:hl7 org:v3”)]
公共接口IPRPA_AR101202
{
[运营合同(Name=“PersonRevised”,Action=“urn:hl7 org:v3/PRPA\u in01204”)]
PersonRevied响应PersonRevied(消息请求);
}
公共类PRPA_AR101202:WCFServiceBase,IPRPA_AR101202
{
PersonRevied响应IPRPA\U AR101202.PersonRevied(消息请求)
{
PersonRevised pr=this.ParseMessage(请求,HL7_XML_名称空间);
PersonReviedResult=新PersonReviedResult();
PersonReviedResponse r=新的PersonReviedResponse(结果);
返回r;
}
}
更新:
根据答案,我能够创建一个接受字符串的WCF服务,但是现在我在基于WSDL契约(在输入参数上)的已实现服务上得到null;不管它是字符串还是XmlDocument/XmlNode
想法
我需要一个接受/返回XML的服务,而不是序列化的服务
类型
在这种情况下,最好使用POX,而不要使用SOAP/WSDL。有一些资源用于此和
这样做的原因是,如果传入的XML中存在错误,那么它将
将在它击中我的代码之前失败-我们不能有这个
我知道你在说什么。令人恼火的是,任何序列化异常都会终止通道,而不是冒泡返回到客户机,然而,公开服务元数据端点的整个要点是,客户机始终会正确地序列化在服务边界之外公开的类型,因为WSDL就是为了这样
实际上,我想要类似于:XmlDocument的东西
人员修订(XML文件请求)代码>
毫无疑问,您知道,公开XmlDocument类型并不等同于公开XML。公开XmlDocument不会很好
如果您绝对需要对反序列化进行完全控制,则必须将您的操作公开为接受string类型的参数。然后你可以用它做你想做的事
public string PersonRevised(string request)
{
// Deserialize here...
}
如何生成服务?针对WSDL运行svcutil.exe。它正在创建上面的代码。它生成了接口,对不对,而不是服务实现。听起来好像您正在尝试基于现有WSDL实现/创建服务。我认为除了考虑实现消息检查器之外,没有一种简单的方法可以实现您想要的。另一个选项(如果您的服务不必完全匹配WSDL)是将操作的返回类型更改为string
,并将XML作为字符串传递。这是可行的,但是现在字符串中的数据总是空的。我已经更新了问题,有什么建议吗?@RyanTernier与其编辑您当前的问题,不如就这个问题问一个新问题。一旦你这么做了,请告诉我,我会看一看。