标签: wsdl

xml序列化导致字段缺失

第三方给了我一个 wsdl。这个 wsdl 是使用 MessageContract 定义的(我很遗憾地说,经过多次谷歌搜索后,我仍然不明白从客户端角度使用MessageContractServiceContract时有什么区别)

实例化一个BaseComplex类型的新复杂对象后,该对象由ComplexA[]ComplexB[]数组组成,其中ComplexADecimalDecimal?定义属性后,我然后调用传入BaseComplex类型的服务方法。(不幸的是,由于防火墙的原因,我无法在本地调试服务请求,但是,我已经验证了BaseComplex.ComplexA.Decimal字段在调用服务之前有一个值。)

将代码放置在服务器上后,我的团队就使用 WireShark 来准确查看通过网络传输的数据包中的内容。当我们看到这个时,ComplexA.Decimal字段已被省略......甚至没有空标签。

我能想到的唯一步骤发生在client.SendRequest(BaseComplex)之间调用和 WireShark 输出显示之间的步骤是 .Net 框架的 Xml 序列化。我已经用谷歌搜索了这个问题,但没有找到任何可以给我指明正确方向的东西。

为什么我的客户端无法正确发出请求 xml?

一些注意事项:

  • 我已将给我的 wsdl 拉入 SoapUI,当在服务器上运行它时,我们看到成功的结果。(我在运行代码时在测试中使用相同的值)
  • 我只是这个 wsdl 的消费者/客户端,无法控制 wsdl/服务定义。
  • 我没有真正理解为什么服务是使用 MessageContract不是ServiceContract完成的......(我之前使用 ServiceContract 从未遇到过这个问题)
  • 该问题最有趣的方面之一是 ComplexBase定义Decimal字段,并且该字段正确序列化。也就是说,Request.DecimalProperty会序列化,但Request.ComplexA.DecimalProperty不会序列化。
  • 其他一些注意事项是,这只是 ComplexA 类型中的 Decimal 和可为 null Decimal 字段的问题。ComplexA.DecimalProperty …

c# xml wcf wsdl web-services

2
推荐指数
1
解决办法
579
查看次数

从 C# 中的 SOAP API 捕获实际错误详细信息

在 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# 中的实际错误详细信息“无效的访问许可证号”,而不是由于客户端数据而引发错误异常

先感谢您

c# api wsdl web-services

2
推荐指数
1
解决办法
2972
查看次数

如何查找wsdl版本

任何人都可以建议我如何找到我的网络服务公开的 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)。

有什么建议请。

soap wsdl web-services

2
推荐指数
1
解决办法
4718
查看次数

如何在WCF中编写WSDL?

我想知道如何用wcf编写wsdl.据我所知,代理类序列化数据并形成一条肥皂消息通过网络发送,同样,我想知道是谁编写了wsdl文件并负责序列化调用结果.

wcf wsdl

1
推荐指数
1
解决办法
1274
查看次数

绑定中指定的操作没有为'Porttype'定义,但它存在,wsdl .. help

这件事让我抓狂......每当我试图验证它时......它给了我错误

<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)

xml xsd wsdl operations porttype

1
推荐指数
2
解决办法
1万
查看次数

SOAP-nillable =“ true”

我正在使用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 wsdl web-services zend-framework zend-soap

1
推荐指数
1
解决办法
2万
查看次数

如何在PHP中更改SOAP命名空间以匹配WSDL?

我目前正在为我工​​作的公司开展一个项目.该项目需要向另一家公司发出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)

php soap wsdl

1
推荐指数
1
解决办法
6072
查看次数

方法中的参数太多...(从Delphi XE中的WSDL连接到WebService)

有一个外部Web服务,分别要求客户端给他.基于shell Embarcadero的WSDL标准RAD Studio XE(Delphi XE)创建了一个通常运行良好的单元,但在这种情况下有一个警告 - 其中一个函数转移到100多个参数.当您在运行时创建用于调用Web服务的对象时,会收到错误"方法'方法名称中的参数太多'".如果参数的数量减少到61,那么一切都开始工作 - 调用Web服务运行正常并返回响应.为什么会这样?转向互联网,但结果为零.

delphi wsdl web-services queryinterface delphi-xe

1
推荐指数
1
解决办法
748
查看次数

WSDL错误:XSD:位置尚未解决

我刚从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加载它,那么我会重新发生此错误.我猜测项目配置必须有一些东西,但是方面是相同的,所以我不知道哪个配置是不同的.无论如何要告诉?

任何想法或建议赞赏!

xsd wsdl eclipse-indigo eclipse-juno

1
推荐指数
1
解决办法
1万
查看次数

客户端找不到{}的调度方法

我有这个示例代码:

    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)

java soap wsdl web-services

1
推荐指数
1
解决办法
2万
查看次数