第三方给了我一个 wsdl。这个 wsdl 是使用 MessageContract 定义的(我很遗憾地说,经过多次谷歌搜索后,我仍然不明白从客户端角度使用MessageContract与ServiceContract时有什么区别)
实例化一个BaseComplex类型的新复杂对象后,该对象由ComplexA[]和ComplexB[]数组组成,其中ComplexA有Decimal和Decimal?定义属性后,我然后调用传入BaseComplex类型的服务方法。(不幸的是,由于防火墙的原因,我无法在本地调试服务请求,但是,我已经验证了BaseComplex.ComplexA.Decimal字段在调用服务之前有一个值。)
将代码放置在服务器上后,我的团队就使用 WireShark 来准确查看通过网络传输的数据包中的内容。当我们看到这个时,ComplexA.Decimal字段已被省略......甚至没有空标签。
我能想到的唯一步骤发生在client.SendRequest(BaseComplex)之间调用和 WireShark 输出显示之间的步骤是 .Net 框架的 Xml 序列化。我已经用谷歌搜索了这个问题,但没有找到任何可以给我指明正确方向的东西。
为什么我的客户端无法正确发出请求 xml?
一些注意事项:
在 C# 中访问 SoapAPI 我在我的 c# 类中添加了 WSDL 文件作为 SeriviceRefrence 一些我无法捕获该 API 抛出的实际异常的原因
我收到 ErrorMessage:-“由于客户端数据而引发异常”。
内部异常:-空,
为了捕获实际异常,我尝试了以下代码:-
public RegisterResponse1 RegisterAccount()
{
try
{
var upss = CreateAccessRequest();
//Process Request
var responce = regService.ProcessRegister(CreateRegisterWebServiceRequest(shipment));
return responce;
}
catch (SoapException ex)
{
//I never go here
return null;
}
catch (FaultException ex)
{
//always go there
return null;
}
catch (Exception ex)
{
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的异常处理中,我总是犯规FaultException(例如)上面来自FaultException的errorMessaeg
当我尝试从 SoapUI(readyAPI) 工具手动请求此 API 时,我得到了以下错误详细信息,这是来自 API 端的实际错误,我希望在我的 C# 库中看到以下实际错误详细信息

“无效的访问许可证号”是我想要获取的实际消息
请帮助我捕获 c# 中的实际错误详细信息“无效的访问许可证号”,而不是由于客户端数据而引发错误异常
先感谢您
任何人都可以建议我如何找到我的网络服务公开的 wsdl 版本 -
来自 wsdl 的片段 -
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata"
xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex"
xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy"
xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract"
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tns="http://tempuri.org/"
xmlns:wsa10="http://www.w3.org/2005/08/addressing"
xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
name="XXXService" targetNamespace="http://tempuri.org/">
Run Code Online (Sandbox Code Playgroud)
我已经浏览了这些网络链接 -
https://coderanch.com/t/502335/certification/define-wsdl-version
根据上面的帖子,它是 1.2
而查看此 -
https://www.soapui.org/docs/soap-and-wsdl/working-with-wsdls/
SoapUI 文档显示“SoapUI 支持 1.1 版本的 WSDL 规范”。因为我的 wsdl 在 SoapUI 中加载成功 - 它可能是版本 1.1 吗?
因此,我不确定我的 Web 服务正在公开哪个版本的 wsdl (1.1/1.2/2.0)。
有什么建议请。
我想知道如何用wcf编写wsdl.据我所知,代理类序列化数据并形成一条肥皂消息通过网络发送,同样,我想知道是谁编写了wsdl文件并负责序列化调用结果.
这件事让我抓狂......每当我试图验证它时......它给了我错误
<wsdl:operation name="ComposedClassOpt">
Run Code Online (Sandbox Code Playgroud)
完整的定义如下......
"没有为端口类型'ComposedClassPortType'定义为'Binding'绑定指定的操作.此绑定中指定的所有操作必须在端口类型'ComposedClassPortType'中定义."
但操作在PortType中
谢谢你.
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="compose" targetNamespace="http://composeWsdl/"
xmlns:wsdl2="http://BookService2/" xmlns:plnk="http://docs.oasis-open.org/wsbpel/2.0/plnktype"
xmlns:wsdl1="http://BookService1/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:tns="http://composeWsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:vprop="http://docs.oasis-open.org/wsbpel/2.0/varprop" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xsdcomp="http://ComposedClass/">
<wsdl:import namespace="http://BookService1/"
location="/Users/adnan/Documents/workspace/TestBpel/BookService1.wsdl">
</wsdl:import>
<wsdl:import namespace="http://ComposedClass/"
location="/Users/adnan/Documents/workspace/wsdlparse/ComposedClass.xsd">
</wsdl:import>
<wsdl:import namespace="http://BookService2/"
location="/Users/adnan/Documents/workspace/TestBpel/BookService2.wsdl">
</wsdl:import>
<wsdl:message name="ComposedClassINMsg">
<wsdl:part name="ComposedClassINMsgPayload" element="xsdcomp:ComposedClassIN">
</wsdl:part>
</wsdl:message>
<wsdl:message name="fault">
<wsdl:part name="FaultPayload" type="xsd:string">
</wsdl:part>
</wsdl:message>
<wsdl:message name="ComposedClassResponseMsg">
<wsdl:part name="ComposedClassResponseMsgPayload" element="xsdcomp:ComposedClassResponse">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="ComposedClassPortType">
<wsdl:operation name="ComposedClassOpt">
<wsdl:input name="ComposedClassINMsg" message="tns:ComposedClassINMsg">
</wsdl:input>
<wsdl:output name="ComposedClassResponseMsg" message="tns:ComposedClassResponseMsg">
</wsdl:output>
<wsdl:fault name="generalFault" message="tns:fault">
</wsdl:fault>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="Binding" type="tns:ComposedClassPortType">
<soap:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/http" /> …Run Code Online (Sandbox Code Playgroud) 我正在使用Zend Framework构建Web服务。我正在使用Zend_Soap_AutoDiscover类来生成WSDL。我在此Web服务表单示例中使用了各种复杂类型:
StockItemEntity类
class StockItemEntity {
/** @var string */
public $sStockCode;
/** @var string */
public $sQty;
public function __construct($sStockCode, $sQty){
$this->sStockCode = $sStockCode;
$this->sQty = $sQty;
}
}
Run Code Online (Sandbox Code Playgroud)
WSDL定义
<xsd:complexType name="StockItemEntity">
<xsd:all>
<xsd:element name="sStockCode" type="xsd:string" nillable="true"/>
<xsd:element name="sQty" type="xsd:string" nillable="true"/>
</xsd:all>
</xsd:complexType>
Run Code Online (Sandbox Code Playgroud)
根据我在网络上的阅读了解,nillable =“ true”在那里,因为可以将任何对象的属性设置为null。因此,即使StockItemEntity对象的所有属性都设置为null,也需要nillable =“ true”来维护有效的XML文档。
我担心的是,这两个属性必须始终传递给web方法。是否可以删除“ nillable = true”以强制属性不为null?否则,有任何方法可以在这些属性中强制使用非null值。我希望避免在网络服务方面进行验证。
谢谢
亲切的问候
加布里埃尔
我目前正在为我工作的公司开展一个项目.该项目需要向另一家公司发出SOAP请求(通过PHP).我的PHP代码中的SoapClient与另一家公司的SOAP服务器进行通信,但我得到的只是"INVALID XML".在检查了它们的WSDL和响应之后,我注意到它们的命名空间是不同的.我需要更改我的命名空间以匹配他们的名称空间.
例如:我的请求中的标记显示"ns1".和"环境",但他们的"肥皂".
我怎么能改变这个?
这是我的代码示例,发出的请求和收到的响应.
---------------- CODE ----------------
$client = new SoapClient("http://ws.example.com/test/test.asmx?WSDL", array('soap_version'=>SOAP_1_2, 'trace' => 1));
$result = $client->TestFunction(array('Packet'=>'<Email>test@example.com</Email><Password>examplepassword</Password>'));
$sessionid = $result->TestFunctionResult;
print $sessionid;
echo "REQUEST HEADER:\n" . htmlentities($client->__getLastRequestHeaders()) . "\n";
echo "REQUEST:\n" . htmlentities($client->__getLastRequest()) . "\n";
echo "RESPONSE HEADER:\n" . htmlentities($client->__getLastResponseHeaders()) . "\n";
echo "RESPONSE:\n" . htmlentities($client->__getLastResponse()) . "\n";
------------ REQUEST SENT -------------
POST /test/test.asmx HTTP/1.1
Host: ws.example.com
Connection: Keep-Alive
User-Agent: PHP-SOAP/5.3.4
Content-Type: application/soap+xml; charset=utf-8; action="http://ws.example.com/test/TestFunction"
Content-Length: 352
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope …Run Code Online (Sandbox Code Playgroud) 有一个外部Web服务,分别要求客户端给他.基于shell Embarcadero的WSDL标准RAD Studio XE(Delphi XE)创建了一个通常运行良好的单元,但在这种情况下有一个警告 - 其中一个函数转移到100多个参数.当您在运行时创建用于调用Web服务的对象时,会收到错误"方法'方法名称中的参数太多'".如果参数的数量减少到61,那么一切都开始工作 - 调用Web服务运行正常并返回响应.为什么会这样?转向互联网,但结果为零.
我刚从Eclipse Indigo(3.7)升级到Eclipse Juno(4.2),我的WSDL在Indigo中没有任何问题进行验证,我现在得到一个奇怪的警告和错误,我不明白.
WSDL片段:
<wsdl:types>
<xsd:schema
targetNamespace="http://www.domain.com/ClientServices/LendingSimulation/V1"
xmlns:cpReq="http://www.domain.com/ClientServices/LendingSimulation/CalculateProfitabilityRequest"
xmlns:cpRes="http://www.domain.com/ClientServices/LendingSimulation/CalculateProfitabilityResponse"
xmlns:error="http://www.domain.com/fw/errorMgmt">
<xsd:import namespace="http://www.domain.com/ClientServices/LendingSimulation/CalculateProfitabilityRequest" schemaLocation="CalculateProfitabilityRequest.xsd" />
<xsd:element name="calculateProfitabilityRequest" type="cpReq:CalculateProfitabilityRequestType" />
</xsd:schema>
</wsdl:types>
Run Code Online (Sandbox Code Playgroud)
Juno使用以下警告标记xsd:import行:
XSD: The location 'CalculateProfitabilityRequest.xsd' has not been resolved
Run Code Online (Sandbox Code Playgroud)
然后标记xsd:element行,并显示以下错误:
XSD: Type reference 'http://www.domain.com/ClientServices/LendingSimulation/CalculateProfitabilityRequest#CalculateProfitabilityRequestType' is unresolved
Run Code Online (Sandbox Code Playgroud)
我很难过.我不仅不理解警告或错误消息的含义,我不明白为什么Juno将此标记为问题,但在Indigo中没有问题.如果我按Ctrl键单击schemaLocation,Eclipse将打开相关的xsd文件,因此Eclipse不会找到该文件.
我试过清理这个项目,但它没有任何区别.
编辑
我咬紧牙关,决定重新安装Indigo Java EE(3.7).但是,现在当我加载我的项目时,我得到了与Juno相同的错误!所以它似乎不是Juno本身,而是我配置中的某些东西是不正确的.但是,我不知道在哪里可以找到问题,或者为什么Eclipse抱怨该位置没有得到解决.这几乎就像我必须以某种方式预装Eclipse中的文件,但我不知道如何.
如果我删除项目,并将项目重新加载为现有Maven项目,则所有警告和错误消息都将消失.但是,该项目随后与我的SCM无关.如果我通过SCM加载它,那么我会重新发生此错误.我猜测项目配置必须有一些东西,但是方面是相同的,所以我不知道哪个配置是不同的.无论如何要告诉?
任何想法或建议赞赏!
我有这个示例代码:
private static final String endpoint = "https://www.***.**:443/WSEndUser?wsdl";
public static void main(String[] args) throws SOAPException {
SOAPMessage message = MessageFactory.newInstance().createMessage();
SOAPHeader header = message.getSOAPHeader();
header.detachNode();
/*
SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();
envelope.setAttribute("namespace","namespaceUrl");
*/
SOAPBody body = message.getSOAPBody();
QName bodyName = new QName("getVServers");
SOAPBodyElement bodyElement = body.addBodyElement(bodyName);
SOAPElement symbol = bodyElement.addChildElement("loginName");
symbol.addTextNode("my login name");
symbol = bodyElement.addChildElement("password");
symbol.addTextNode("my password");
SOAPConnection connection = SOAPConnectionFactory.newInstance().createConnection();
SOAPMessage response = connection.call(message, endpoint);
connection.close();
SOAPBody responseBody = response.getSOAPBody();
SOAPBodyElement responseElement = (SOAPBodyElement)responseBody.getChildElements().next();
SOAPElement returnElement = (SOAPElement)responseElement.getChildElements().next();
if(responseBody.getFault()!=null){ …Run Code Online (Sandbox Code Playgroud)