Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从WSDL生成WCF web服务(SOAP)以接受/返回XML而不是序列化类型_C#_Xml_Web Services_Wcf_Soap - Fatal编程技术网

C# 从WSDL生成WCF web服务(SOAP)以接受/返回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

我有一个大的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;
        }

    }
[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与其编辑您当前的问题,不如就这个问题问一个新问题。一旦你这么做了,请告诉我,我会看一看。