使用 Web 服务时出错,内容类型“application/xop+xml”与预期的类型“text/xml”不匹配
本文关键字:类型 不匹配 xml text xop+xml application 服务 Web 出错 使用 | 更新日期: 2023-09-27 18:33:33
我在为我公司购买的产品使用网络服务时遇到了一个奇怪的问题。 该产品名为Campaign Commander,由一家名为Email Vision的公司制造。 我们正在尝试使用"数据批量更新 SOAP API"。
每当我尝试调用 Web 服务上的任何方法时,调用实际上都会成功,但客户端在处理响应时失败,并且我收到异常。
错误的详细信息如下,感谢您可以提供的任何帮助。
使用 Web 引用(旧样式 Web 服务客户端(时出错
将服务用作 Web 参考时,我会收到我所做的任何调用的InvalidOperationException
,并显示以下消息:
Client found response content type of 'multipart/related; type="application/xop+xml"; boundary="uuid:170e63fa-183c-4b18-9364-c62ca545a6e0"; start="<root.message@cxf.apache.org>"; start-info="text/xml"', but expected 'text/xml'.
The request failed with the error message:
--
--uuid:170e63fa-183c-4b18-9364-c62ca545a6e0
Content-Type: application/xop+xml; charset=UTF-8; type="text/xml";
Content-Transfer-Encoding: binary
Content-ID: <root.message@cxf.apache.org>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:openApiConnectionResponse xmlns:ns2="http://api.service.apibatchmember.emailvision.com/" xmlns:ns3="http://exceptions.service.apibatchmember.emailvision.com/">
<return>DpKTe-9swUeOsxhHH9t-uLPeLyg-aa2xk3-aKe9oJ5S9Yymrnuf1FxYnzpaFojsQSkSCbJsZmrZ_d3v2-7Hj</return>
</ns2:openApiConnectionResponse>
</soap:Body>
</soap:Envelope>
--uuid:170e63fa-183c-4b18-9364-c62ca545a6e0--
--.
如您所见,响应 soap 信封看起来有效(这是一个有效的响应,调用成功(,但客户端似乎内容类型有问题并生成异常。
使用服务引用(WCF 客户端(时出错
当我将服务用作服务引用时,我会收到我所做的任何调用的ProtocolException
,并显示以下消息:
The content type multipart/related; type="application/xop+xml"; boundary="uuid:af66440a-012e-4444-8814-895c843de5ec"; start="<root.message@cxf.apache.org>"; start-info="text/xml" of the response message does not match the content type of the binding (text/xml; charset=utf-8). If using a custom encoder, be sure that the IsContentTypeSupported method is implemented properly. The first 648 bytes of the response were: '
--uuid:af66440a-012e-4444-8814-895c843de5ec
Content-Type: application/xop+xml; charset=UTF-8; type="text/xml";
Content-Transfer-Encoding: binary
Content-ID: <root.message@cxf.apache.org>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:openApiConnectionResponse xmlns:ns2="http://api.service.apibatchmember.emailvision.com/" xmlns:ns3="http://exceptions.service.apibatchmember.emailvision.com/">
<return>Dqaqb-MJ9V_eplZ8fPh4tdHUbxM-ZtuZsDG6GalAGZSfSzyxgtuuIxZc3aSsnhI4b0SCbJsZmrZ_d3v2-7G8</return>
</ns2:openApiConnectionResponse>
</soap:Body>
</soap:Envelope>
--uuid:af66440a-012e-4444-8814-895c843de5ec--'.
就像前面的示例一样;我们得到了有效的 SOAP 响应,并且调用成功,但客户端似乎内容类型有问题并生成了异常。
我可以设置任何选项,以便客户端对响应类型没有问题? 我已经做了一些谷歌搜索,但到目前为止,我发现的任何东西都没有帮助我。
对于任何遇到相同问题的人;我找到了将 Web 服务用作服务参考 (WCF( 的解决方案。 BasicHttpBinding.MessageEncoding 属性需要设置为"Mtom"。
以下是所需配置设置的代码片段:
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding messageEncoding="Mtom">
</binding>
</basicHttpBinding>
</bindings>
</system.serviceModel>
</configuration>
编辑:如果您在自定义绑定中遇到相同的问题,请参阅@robmzd的答案。
我还没有找到将其用作旧样式 Web 参考的解决方案。
在为此苦苦挣扎了几天之后,我为这个问题找到了一个非常简单的解决方案:
- 通过从VS2010的主菜单中选择工具->WCF服务配置编辑器来激活配置编辑器;
- 再次关闭它;
- 右键单击 App.Config 文件以查找新的菜单项"编辑 WCF 配置";
- 单击绑定;
- 将消息编码更改为 mtom;
- 救。
我希望这会帮助某人。
我遇到了同样的问题,但<customBinding>
.若要修复此问题,可以使用绑定下的单独<mtomMessageEncoding>
配置节点配置 Mtom 消息编码。
<configuration>
<system.serviceModel>
<bindings>
<customBinding>
<binding name="MyServiceBinding">
<mtomMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16" messageVersion="Soap12" writeEncoding="utf-8">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
</mtomMessageEncoding>
</binding>
</customBinding>
</bindings>
</system.serviceModel>
</configuration>
如果要自承载 WCF 服务,并且要通过 WCF 客户端使用该服务。您必须记住在主机中设置MessageEncoding
属性,如下所示:
BasicHttpBinding binding = new BasicHttpBinding();
binding.MessageEncoding = WSMessageEncoding.Mtom;
我也遇到了这个问题。我的客户端在启动时一直抛出此异常,直到我意识到我忘记在主机应用程序中设置绑定MessageEncoding
属性,我才弄清楚原因。
我在相同的功能和同一家公司遇到了完全相同的问题,我在谷歌上花了几个小时试图找到正确的答案。经过这么多次的考验,我终于明白了。以下是我所做的:以下字符串是从电子邮件视觉中返回我的响应(我的主要目的是批量上传,但为了简单和测试,我交换到 getLastUpload(。
字符串(2180( ">
--uuid:5c8a8a1d-a29c-43d0-baaa-cb3a8c189962
Content-Type: application/xop+xml; charset=UTF-8; type="text/xml";
Content-Transfer-Encoding: binary
Content-ID: <root.message@cxf.apache.org>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:getLastUploadResponse xmlns:ns2="http://api.service.apibatchmember.emailvision.com/" xmlns:ns3="http://exceptions.service.apibatchmember.emailvision.com/"><return><id>254816</id><source>API_BATCH_MEMBER</source><status>DONE</status></return><return><id>254810</id><source>API_BATCH_MEMBER</source><status>DONE</status></return><return><id>254805</id><source>API_BATCH_MEMBER</source><status>DONE</status></return><return><id>254799</id><source>API_BATCH_MEMBER</source><status>DONE</status></return><return><id>254797</id><source>API_BATCH_MEMBER</source><status>DONE</status></return><return><id>254791</id><source>API_BATCH_MEMBER</source><status>DONE</status></return><return><id>254790</id><source>API_BATCH_MEMBER</source><status>DONE</status></return><return><id>254771</id><source>API_BATCH_MEMBER</source><status>DONE</status></return><return><id>254770</id><source>API_BATCH_MEMBER</source><status>ERROR</status></return><return><id>254759</id><source>API_BATCH_MEMBER</source><status>DONE</status></return><return><id>254747</id><source>API_BATCH_MEMBER</source><status>DONE</status></return><return><id>253619</id><source>CCMD</source><status>DONE</status></return><return><id>238053</id><source>CCMD</source><status>DONE WITH ERROR(S)</status></return><return><id>216618</id><source>CCMD</source><status>DONE WITH ERROR(S)</status></return><return><id>200373</id><source>CCMD</source><status>DONE</status></return><return><id>200367</id><source>CCMD</source><status>DONE</status></return><return><id>195445</id><source>CCMD</source><status>DONE</status></return><return><id>194579</id><source>CCMD</source><status>DONE</status></return><return><id>194263</id><source>CCMD</source><status>DONE</status></return><return><id>193740</id><source>CCMD</source><status>DONE</status></return></ns2:getLastUploadResponse></soap:Body></soap:Envelope>
--uuid:5c8a8a1d-a29c-43d0-baaa-cb3a8c189962--
如果你看一下字符串的顶部,它有一个键值和来自服务器的其他工作人员,这使得 SoapClient 类抛出异常"看起来我们没有 XML 文档"。即使 xml 文档低于所有这些工作人员。
--uuid:5c8a8a1d-a29c-43d0-baaa-cb3a8c189962
Content-Type: application/xop+xml; charset=UTF-8; type="text/xml";
Content-Transfer-Encoding: binary
Content-ID: <root.message@cxf.apache.org>
同样,在字符串的底部(在 xml 之后(出现相同的键
--uuid:5c8a8a1d-a29c-43d0-baaa-cb3a8c189962--
因此,解决方案是尝试从xml文件的开头到开头以及从xml文件的末尾到字符串的末尾删除字符串的一部分。我找到了一个非常好的脚本,帮助我在这里处理这个解决方案 MTOM php 客户端。但是,我的响应xml有点不同,所以我只是稍微修改了该脚本,这是我的版本。
function upload_file_insert_via_soap_obj( $token, $csv_file )
{
try
{
$wsdl_loc = 'https:XXX/apibatchmember/services/BatchMemberService?wsdl';
$soap_Object = new MTOMSoapClient( $wsdl_loc, array( 'cache_wsdl' => WSDL_CACHE_NONE, 'trace' => true ) );
$parameters['token'] = $token;
$parameters['insertUpload']['fileName'] = "insertMemberTest.txt";
$parameters['insertUpload']['fileEncoding'] = "UTF-8";
$parameters['insertUpload']['separator'] = ",";
$parameters['insertUpload']['skipFirstLine'] = "false";
$parameters['insertUpload']['autoMapping'] = "true";
$parameters['file'] = file_get_contents( "insertMemberTest.txt" );
$results = $soap_Object->uploadFileInsert( $parameters );
$upload_id = $results->return;
echo "<br/>upload_id: ".$upload_id;
return $upload_id;
}
catch ( Exception $exception )
{
echo "EX REQUEST: " . $soap_Object->__getLastRequest() . "<br/>";
echo "EX RESPONSE: " . $soap_Object->__getLastResponse() . "<br/>";
echo "<br/>Response var dump: "; var_dump( $soap_Object->__getLastResponse() ); echo "<br/>";
echo '<br/><br/> Exception: '.$exception->getMessage()."<br/>";
var_dump( $exception );
}
}
/**
* This client extends the ususal SoapClient to handle mtom encoding. Due
* to mtom encoding soap body has test apart from valid xml. This extension
* remove the text and just keeps the response xml.
*/
class MTOMSoapClient extends SoapClient
{
public function __doRequest( $request, $location, $action, $version, $one_way = 0 )
{
$response = parent::__doRequest( $request, $location, $action, $version, $one_way );
//if resposnse content type is mtom strip away everything but the xml.
if ( strpos( $response, "Content-Type: application/xop+xml" ) !== false )
{
//not using stristr function twice because not supported in php 5.2 as shown below
//$response = stristr(stristr($response, "<s:"), "</s:Envelope>", true) . "</s:Envelope>";
$tempstr = stristr( $response, "<soap:" );
$response = substr( $tempstr, 0, strpos( $tempstr, "</soap:Envelope>" ) ) . "</soap:Envelope>";
}
//log_message($response);
return $response;
}
}
我只是遇到了这个问题,因为<<strong>configSection>不是<配置>配置>>中的第一个元素。
我不确定这是否是放置这个的合适位置,但我很难让我的 Windows 服务连接到 WSDL(使用自动生成的 Web 引用(。
我在这里遇到了与原始海报相同的错误。 由于我没有使用 WCF,因此 app.config 对我不起作用,并导致我的服务无法启动。 我确实在MSDN上找到了一个帖子,其中AjayChigurupati表示要改变
public partial class WsdlService : System.Web.Services.Protocols.SoapHttpClientProtocol {...}
自
public partial class WsdlService : Microsoft.Web.Services3.WebServicesClientProtocol {...}
(确保将Microsoft.Web.Services3
引用添加到项目中(
现在我们可以访问布尔属性RequireMtom
,你可以像这样包围你的调用函数:
public DownloadResponse downloadDataFile([System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] DownloadRequest Request) {
RequireMtom = true; // ADDED
object[] results = this.Invoke("downloadDataFile", new object[] {
Request});
RequireMtom = false; // ADDED
return ((DownloadResponse)(results[0]));
}
希望这可以帮助将来遇到相同问题的其他人。