【问题标题】:ASMX WebServices issueASMX Web 服务问题
【发布时间】:2009-03-05 10:01:23
【问题描述】:

我们正在向 .Net 3.5 ASMX Web 服务发送以下请求。

<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
        <Login xmlns="http://tempuri.org/" id="o0" SOAP-ENC:root="1">
          <password xsi:type="xsd:string">1234</password> 
          <userName xsi:type="xsd:string">Developer</userName> 
        </Login>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>      


在调试 Web 服务时,我们发现 Web 方法(登录名和方法)可用的参数值为空。 但是,如果我们从密码和用户名中删除 xsi:type="xsd:string" 属性,一切正常。
命名空间 xsd 指向http://www.w3.org/2001/XMLSchema,这是有效的。
为什么.Net 不能反序列化响应?为什么它不抛出异常? 顺便说一句:我们的服务定义别名 http://www.w3.org/2001/XMLSchema 为“s”。这可能是个问题吗?

亲切的问候,

【问题讨论】:

  • 是为了在 Stack Overflow 上的可读性而添加的
    标签还是您信封的一部分?
  • 增加可读性:)

标签: .net web-services soap


【解决方案1】:

.NET 序列化程序依赖底层架构来反序列化内容。当你指定 xsi:type 属性时,你基本上打破了模式契约。

顺便说一句。不要使用http://tempuri.org/,自己编一个URI。

【讨论】:

  • 谢谢。但是为什么会断呢?我们指定了 xsd,它指向w3.org/2001/XMLSchema。所以这应该是有效的。
  • w3.org/2001/XMLSchema 不是您的架构,序列化程序应该可以理解。你的模式应该在默认的 xmlns 下,tempuri.org 现在是。
【解决方案2】:

您的 ASMX 服务是否使用 [SoapRpcService] 属性修饰?如果不是,那么它是一个文档/文字服务,并且不需要该格式的 XML。

这个 XML 是如何发送的?是手工建造的吗?它是由基于“service.asmx?WSDL”派生的 WSDL 创建的 Java 客户端发送的吗?

【讨论】:

  • 是的,它是由 k-soap 发送的。显然我们使用了错误的 k-soap 构建并更新了我们的代码以使用最新的构建。这已经解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多