在.NET中使用Java Webservice

时间:2009-09-28 11:48:24

标签: java .net web-services wsdl

我正在努力将.NET应用程序与基于Servlet的Java应用程序Hermes2(H2O)集成。 Java应用程序公开了几个Web服务,我试图在Visual Studio 2008中创建这些Web引用。但是这只会导致一个空代理,并注释错误消息:“CODEGEN:来自命名空间的操作绑定'Request' http://service.ebms.edi.cecid.hku.hk/'被忽略。不支持指定使用类型=文字消息。“。

当我尝试通过.NET中的wsdl.exe实用程序运行WSDL时,我得到以下输出:

Microsoft (R) Web Services Description Language Utility
[Microsoft (R) .NET Framework, Version 2.0.50727.42]
Copyright (C) Microsoft Corporation. All rights reserved.
Warning: This web reference does not conform to WS-I Basic Profile v1.1.
R2204: A document-literal binding in a DESCRIPTION MUST refer, in each of its soapbind:body element(s), only to wsdl:part element(s) that have been defined using the element attribute. 
-  Part 'messageId' of message 'EbmsRequestMsg' from service description with targetNamespace='http://service.ebms.edi.cecid.hku.hk/'.
-  Part 'hasMessage' of message 'EbmsResponseMsg' from service description with targetNamespace='http://service.ebms.edi.cecid.hku.hk/'.

For more details on the WS-I Basic Profile v1.1, see the specification 
at http://www.ws-i.org/Profiles/BasicProfile-1.1.html.

Warning: one or more operations were skipped.
Warnings were encountered. Review generated source comments for more details.

Writing file 'C:\Files\Temp\Helsekortet\Hermes\wsdl\EbmsMessageReceiverDownload.cs'.

是否有人知道问题是什么,以及可能如何解决这个问题?我认为Hermes2使用某种常见的Webservices库。是否有任何此类Java库生成无效的WSDL,或者这只是.NET不支持的某些功能?

WSDL如下(我在这里看不到任何附加文件的方式,我没有WSDL的URL。抱歉发布了一个臃肿的问题):

<?xml version="1.0" encoding="utf-8"?> 
<definitions 
 xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" 
 xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
 xmlns:s="http://www.w3.org/2001/XMLSchema" 
 xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
 xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" 
 xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" 
 xmlns="http://schemas.xmlsoap.org/wsdl/"
 xmlns:p="http://service.ebms.edi.cecid.hku.hk/" 
 targetNamespace="http://service.ebms.edi.cecid.hku.hk/">
<types>
</types>
<message name="EbmsRequestMsg">
  <part name="messageId" type="s:string" /> 
</message>
<message name="EbmsResponseMsg">
  <part name="hasMessage" type="s:string" /> 
</message>
<portType name="EbmsReceiverDownload">
  <operation name="Request">
    <input message="p:EbmsRequestMsg" /> 
    <output message="p:EbmsResponseMsg" /> 
  </operation>
</portType>
<binding name="EbmsSoapHttpReceiverDownload" type="p:EbmsReceiverDownload">
  <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" /> 
  <operation name="Request">
    <soap:operation soapAction="Ebmsreceiverdownload" style="document" /> 
    <input>
      <soap:body use="literal" /> 
    </input>
    <output>
      <soap:body use="literal" /> 
    </output>
  </operation>
</binding>
<service name="EbmsMessageReceiverDownload">
  <documentation>Documentation not available.</documentation> 
  <port name="EbmsReceiverDownload" binding="p:EbmsSoapHttpReceiverDownload">
    <soap:address location="http://127.0.0.1:8080/corvus/httpd/ebms/receiver" /> 
  </port>
</service>
</definitions>

希望任何人都可以提供帮助。

2 个答案:

答案 0 :(得分:1)

<message name="EbmsRequestMsg">
  <part name="messageId" type="s:string" /> 
</message>
<message name="EbmsResponseMsg">
  <part name="hasMessage" type="s:string" /> 

这些必须引用元素声明而不是原始的简单类型。您需要创建一个包含字符串简单类型的元素包装器。

答案 1 :(得分:1)

我希望有人能提供有关如何解决马丁指出的问题的信息,但没有人这样做: - /

然而,经过几个小时的阅读和尝试,我终于设法将Java应用程序生成的WSDL重写为符合.NET Web服务实现所遵循的标准的东西。

似乎所使用的Java Webservices框架是罪人,但我不知道使用了什么库,因为我不熟悉其中的许多。除了不生成标准符合的WSDL之外,在此应用程序中还有几个其他问题,据我所知,很久以前就解决了这个问题。例如,使用mime“multipart / related”传输二进制数据,但没有引用SOAP xml中的数据。

我认为.NET糟透了......无论如何,这里是重写后产生的WSDL类型和消息部分(因为这些未被修改而忽略了其他部分):

<types>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://service.ebms.edi.cecid.hku.hk/" elementFormDefault="qualified">
        <xs:element name="messageId" type="xs:string" />
        <xs:element name="hasMessage" type="xs:string" />
    </xs:schema>
</types>
<message name="EbmsRequestMsg">
    <part name="messageId" element="p:messageId" />
</message>
<message name="EbmsResponseMsg">
    <part name="hasMessage" element="p:hasMessage" />
</message>

感谢Martin指出我正确的方向: - )