SOAP连接SAP:INTERFACE_HEAD类型转换失败与404错误求助
SAP SOAP连接问题排查与解决方案
问题背景
我是SOAP与SAP新手,需通过SOAP连接SAP,已获取WSDL文件并将其导入为名为SOAPService的服务引用,当前可用类包括:
SOAPService.IMPORT1- 命名空间
myComp.SoapSap下的myComp.SoapSap.INTERFACE_HEAD、myComp.SoapSap.INTERFACE_POS、myComp.SoapSap.IMPORT
编写的代码如下:
Dim soapClient As New myComp.SoapSap.IMPORT Dim soapHead(1) As New myComp.SoapSap.INTERFACE_HEAD Dim soapPos(1) As New myComp.SoapSap.INTERFACE_POS Dim client2 As New SOAPService.IMPORT1 soapClient.Url = "http://" & AppServer Dim Cred As New System.Net.NetworkCredential(User, Passwd) soapClient.Credentials = Cred client2.IV_PRODUCT = "/MYCOMP/ABCD" client2.IV_IMAGE = Convert.FromBase64String(base64_doc) client2.IV_FILENAME = _batch.UserProperty("Filename") client2.IV_EML = Nothing soapHead(0) = New myComp.SoapSap.INTERFACE_HEAD soapHead(0).FIELD = "testheadfield" soapHead(0).VALUE = "testposfield" soappos(0) = New myComp.SoapSap.INTERFACE_POS soappos(0).FIELD = "testposfield" soappos(0).VALUE = "testposvalue" soappos(0).LINE = "testposline" client2.IT_HEAD = soapHead 'Error see below soapClient.IMPORT(soapHead, soappos, client2.IV_EML, client2.IV_FILENAME, client2.IV_IMAGE, client2.IV_PRODUCT, client2.IV_REIMPORT) 'Error 404
遇到的错误:
- 赋值
client2.IT_HEAD = soapHead()时,提示“索引数小于索引数组的维度数”; - 赋值
client2.IT_HEAD = soapHead(0)时,提示“无法将类型INTERFACE_HEAD转换为INTERFACE_HEAD()”; - 赋值
client2.IT_HEAD = soapHead时,提示“无法将类型INTERFACE_HEAD()转换为INTERFACE_HEAD(),因为INTERFACE_HEAD未派生自INTERFACE_HEAD”; - 调用
soapClient.IMPORT()时出现404错误。
问题分析与解决
1. IT_HEAD赋值类型不匹配问题
错误3的核心原因是两个INTERFACE_HEAD类来自不同命名空间:你用myComp.SoapSap.INTERFACE_HEAD创建的数组,但client2.IT_HEAD需要的是SOAPService.INTERFACE_HEAD类型的数组(因为client2是SOAPService.IMPORT1的实例)。同时数组声明语法也存在问题。
修正代码:
' 统一使用SOAPService命名空间下的类 Dim soapHead() As SOAPService.INTERFACE_HEAD = { New SOAPService.INTERFACE_HEAD With { .FIELD = "testheadfield", .VALUE = "testposfield" } } Dim soapPos() As SOAPService.INTERFACE_POS = { New SOAPService.INTERFACE_POS With { .FIELD = "testposfield", .VALUE = "testposvalue", .LINE = "testposline" } } ' 现在可正确赋值 client2.IT_HEAD = soapHead
2. SOAP客户端调用与404错误问题
你同时实例化了myComp.SoapSap.IMPORT和SOAPService.IMPORT1两个类,导致逻辑混淆。应该直接使用服务引用生成的客户端类,而非手动实例化myComp.SoapSap.IMPORT。
404错误的常见原因及解决:
- URL错误:确认
AppServer对应的SAP SOAP服务完整端点(通常格式为http://<sap-server>:<port>/sap/bc/srt/rfc/sap/<函数模块名>/<客户端编号>); - 权限问题:检查所用账号是否有访问该SOAP服务的权限;
- 路径拼写错误:核对WSDL文件中
soap:address节点的URL。
修正后的客户端调用代码:
' 使用服务引用生成的客户端类(通常命名为IMPORT1Client,具体以服务引用生成结果为准) Dim soapClient As New SOAPService.IMPORT1Client() soapClient.Endpoint.Address = New System.ServiceModel.EndpointAddress("http://" & AppServer) ' 设置访问凭据 soapClient.ClientCredentials.Windows.ClientCredential = New System.Net.NetworkCredential(User, Passwd) ' 构造完整请求参数 Dim request As New SOAPService.IMPORT1 request.IV_PRODUCT = "/MYCOMP/ABCD" request.IV_IMAGE = Convert.FromBase64String(base64_doc) request.IV_FILENAME = _batch.UserProperty("Filename") request.IV_EML = Nothing request.IT_HEAD = soapHead request.IT_POS = soapPos ' 对应行项目参数,需匹配服务定义 ' 调用SAP SOAP服务 Dim response = soapClient.IMPORT(request)
关键注意事项
- 不要混用不同命名空间下的同名类,服务引用生成的类已包含所有所需类型,直接使用即可;
- 务必核对SAP SOAP服务的端点URL,确保路径、端口、客户端编号等信息准确;
- 可通过WSDL文件查看服务预期的参数结构,保证请求字段与服务要求一致。
内容的提问来源于stack exchange,提问作者user1673665
相关产品推荐
相关产品推荐

