Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.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
“如何发送”;原始XML“;在XML soap消息中;C#,.Net Web服务_C#_Xml_Web Services_Soap_Payload - Fatal编程技术网

“如何发送”;原始XML“;在XML soap消息中;C#,.Net Web服务

“如何发送”;原始XML“;在XML soap消息中;C#,.Net Web服务,c#,xml,web-services,soap,payload,C#,Xml,Web Services,Soap,Payload,(我使用的是.NET2.0Web服务,而不是WCF,因为我的需求很简单,我想要完全的单声道兼容性…) 好的,我是C#/Visual Studio新手,所以我为这个基本问题道歉 我正在与之通信的SOAP服务提供了一个WSDL,我使用它来创建.NETWeb服务引用。到目前为止,一切顺利 但是,服务期望有效负载是XML字符串,如下所示(示例…) ABCDEF0123456789 1234 测试记录 5678 ]]> 因此,我使用生成的代码调用我的函数,visual studio对我来说非常棒,如下

(我使用的是.NET2.0Web服务,而不是WCF,因为我的需求很简单,我想要完全的单声道兼容性…)

好的,我是C#/Visual Studio新手,所以我为这个基本问题道歉

我正在与之通信的SOAP服务提供了一个WSDL,我使用它来创建.NETWeb服务引用。到目前为止,一切顺利

但是,服务期望有效负载是XML字符串,如下所示(示例…)


ABCDEF0123456789
1234
测试记录
5678
]]>
因此,我使用生成的代码调用我的函数,visual studio对我来说非常棒,如下所示:

//构建一个XML对象,并将其封装在CDATA中
XElement searchQuery=this.BuildSearchXml(参数,搜索);
XCData=新的XCData(searchQuery.ToString());
//XML字符串看起来不错。。。
Console.WriteLine(cdata.ToString()+Environment.NewLine);
//让我们将XML负载发送到服务。。。
搜索客户端=this.Connect(“搜索”);
//Search()要求第二个参数为XML字符串。。。
var returnVal=client.Search(会话,cdata.ToString(),1);
return returnVal.ToString();
不幸的是,web服务粘合代码在生成的神奇之处自动对XML字符串进行URL编码

在进行tcpdump调查时,以下是实际发送的有效负载:


ABCDEF0123456789
![CDATA[搜索
搜索条件
条件
字段1234/字段
值测试记录/值
/状况
/搜索条件
领域
字段5678/字段
/田地
/搜索]]
我的问题是:如何在使用WSDL生成Web引用时继续使用它,但告诉它不要对原始XML字符串进行URL编码,而是按原样发送

我是个新手-我正在查看生成的代码(在.\Web References\MyService\Reference.cs中),但我不知所措

提前感谢您的帮助,为我指明了正确的方向

编辑:添加了Reference.cs的代码

//------------------------------------------------------------------------------
// 
//这段代码是由一个工具生成的。
//运行时版本:4.0.30319.42000
//
//对此文件的更改可能会导致不正确的行为,如果
//重新生成代码。
// 
//------------------------------------------------------------------------------
//
//此源代码由Microsoft.VSDesigner版本4.0.30319.42000自动生成。
//
#pragma警告禁用1591
名称空间MyService.Search{
使用制度;
使用System.Web.Services;
使用系统诊断;
使用System.Web.Services.Protocols;
使用System.Xml.Serialization;
使用系统组件模型;
//……剪下其他东西//
/// 
[System.CodeDom.Compiler.GeneratedCodeAttribute(“System.Web.Services”,“4.6.1055.0”)]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute(“代码”)]
[System.Web.Services.WebServiceBindingAttribute(Name=“searchSoap”,命名空间=”http://foo.bar/bazservice")]
公共部分类搜索:System.Web.Services.Protocols.SoapHttpClientProtocol{
[System.Web.Services.Protocols.SoapDocumentMethodAttribute(“http://foo.bar/bazservice/Search,RequestNamespace=http://foo.bar/bazservice,ResponseNamespace=http://foo.bar/bazservice,Use=System.Web.Services.Description.SoapBindingUse.Literal,ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
公共字符串执行搜索(字符串sessionToken、字符串搜索选项、整数页码){
object[]results=this.Invoke(“搜索”),新对象[]{
sessionToken,
搜索选项,
页码});
返回((字符串)(结果[0]);
}
public void executesarchsync(字符串sessionToken、字符串搜索选项、整数页码){
this.executesarchsync(sessionToken,searchOptions,页码,null);
}
//……剪掉其他方法//
}
}
#pragma警告恢复1591

这不是URL编码。这就是XML编码(实体引用)。它通常在功能上等同于CDATA块。不必担心格式问题——它完全按照它应该做的那样做。只需确保服务正常运行即可


您有搜索功能的代码吗谢谢您的澄清。问题是,服务在收到XML编码的负载时会中断。它需要一个原始的XML负载(顺便说一句,我已经用Python测试了它并使它工作了)。我对这项服务没有任何控制权——这是一项我必须与之互动的专有交易,因此,即使它违反了规则,我也必须违反规则进行补偿。谢谢你的时间!我又看了一眼。你是双重编码。首先,将其嵌入CDATA元素中。然后,序列化程序再次对其进行编码。在不使用CDATA包装的情况下进行尝试(只需将“searchQuery”值直接输入到服务调用中即可)。好的,我会很快地进行尝试,并保持耐心。如果不使用CDATA元素,只需传入searchQuery.ToString(),它也会执行相同的操作(XML编码)。所以,没有骰子。searchQuery值的XML格式是否正确?另外,我有点怀疑这样一个事实,即在另一个搜索元素中有一个搜索元素。如果所有其他操作都失败,请尝试在IDE之外使用SoapUI。