Code First .NET Web 服务使用soap 编码 - 如何防止这种情况?

发布于 2024-08-03 10:29:24 字数 1150 浏览 7 评论 0原文

当从 .NET 接口生成 wsdls 时,如何配置 asp.net/asmx 根本不使用soap编码?简而言之,.NET SOAP Web 服务正在生成包含soap 编码的wsdl。例如:

<s:schema targetNamespace="http://tempuri.org/AbstractTypes">
  <s:import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
  <s:complexType name="StringArray">
    <s:complexContent mixed="false">
      <s:restriction base="soapenc:Array">
        <s:sequence>
          <s:element minOccurs="0" maxOccurs="unbounded" name="String" type="s:string" />
        </s:sequence>
      </s:restriction>
    </s:complexContent>
  </s:complexType>
</s:schema>

由于存在soapenc:Array 位,因此无法使用 CXF(JAX-WS 实现)中的 wsdl2java 进行解析。解决方法是将上面的 xml 更改为:

<s:schema targetNamespace="http://tempuri.org/AbstractTypes">
  <s:import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
  <s:complexType name="StringArray">
        <s:sequence>
          <s:element minOccurs="0" maxOccurs="unbounded" name="String" type="s:string" />
        </s:sequence>
  </s:complexType>
</s:schema>

How would one configure asp.net / asmx to not use soap encoding at all when generating wsdls from a .NET interface? In short, a .NET SOAP Web Service is producing a wsdl that includes soap encoding. For example:

<s:schema targetNamespace="http://tempuri.org/AbstractTypes">
  <s:import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
  <s:complexType name="StringArray">
    <s:complexContent mixed="false">
      <s:restriction base="soapenc:Array">
        <s:sequence>
          <s:element minOccurs="0" maxOccurs="unbounded" name="String" type="s:string" />
        </s:sequence>
      </s:restriction>
    </s:complexContent>
  </s:complexType>
</s:schema>

This fails to parse with wsdl2java in CXF, a JAX-WS implementation due to the soapenc:Array bit. The fix is to change the above xml to:

<s:schema targetNamespace="http://tempuri.org/AbstractTypes">
  <s:import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
  <s:complexType name="StringArray">
        <s:sequence>
          <s:element minOccurs="0" maxOccurs="unbounded" name="String" type="s:string" />
        </s:sequence>
  </s:complexType>
</s:schema>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

风铃鹿 2024-08-10 10:29:24

这是一个问题,其中一个为 6,另一个为 12/2 - wsdl2java 没有按照 Microsoft 的 WSDL 实现认为应该的方式正确支持任何复杂类型。

讨论这是 Java 的错还是 MS 的错是毫无意义的。

不幸的是,很少有 SOAP 实现能够处理除原始类型之外的任何内容,因此,虽然 Microsoft Web 服务表面上看起来具有很好的互操作性,但实际上它们只能与 Microsoft 的代理一起使用。

对于您的解决方法,您有几个选项:

  1. 坚持使用原始 .Net 类型 - 基本上是值类型 + 字符串。没有数组、列表或任何具有复杂序列化的内容。

  2. 编写您自己的 HttpHandler 以 Java 可以处理的格式返回 Xml - 我在处理 Flex/ActionScript(也有同样的问题)时实际上已经做了类似的事情。

  3. 采用不同的格式 - 恕我直言,大多数 Web 正在从 SOAP 转向 REST 风格的服务。

其中(1)是最简单的,但也是最笨重的。您最终会遇到诸如 WDSL 描述的 SOAP 方法之类的黑客行为,该方法返回一个字符串,但该字符串实际上是使用 Java 可以解析的编码 XML。哎呀。

跨平台工作时,你总是会得到这样有趣的东西:-(

This is an issue that is 6 of one, 12/2 for the other - wsdl2java doesn't properly support any complex types the way Microsoft's WSDL implementation thinks it should.

The discussion on whether this is Java or MS's fault is kinda pointless.

Unfortunately there are very few implementations of SOAP that handle anything but primitive types, so while Microsoft Web Services look great for interopability on the surface they actually only really work with Microsoft's proxys.

For your workaround you have a couple of options:

  1. Stick to primitive .Net types - basically value types + string. No arrays, lists or anything with a complex serialisation.

  2. Write your own HttpHandler to return Xml in a format Java can handle - I've actually done something like this when dealing with Flex/ActionScript (which has the same problem).

  3. Go with a different format - IMHO the majority of the web is moving away from SOAP to REST style services.

Of those (1) is the easiest, but also the most clunky. You end up with hacks like a WDSL described SOAP method that returns a string, but that string is actually encoded XML that the consuming Java can parse. Yuk.

You always get fun stuff like this when working across platforms :-(

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文