我们正在开发一个具有几十个服务接口的相当大的应用程序.对于每个服务,使用wsgen生成wsdl(使用jaxws-maven-plugin maven插件).对于每个服务,在wsdl中使用不同的命名空间.
服务接口共享一组公共bean(主要是DTO).现在,每个wsdl的XSD中定义了这些公共类的定义,重复了很多信息,这给我们在客户端造成了问题(大量编译时,类不兼容).
首先,我尝试使用schemagen为公共类创建模式,但无法将其传递给wsgen.有没有办法将一个(或多个)常见XSD传递给wsgen并让生成的wsdl(s)引用这些?
我还尝试使用指定自定义命名空间的@XmlRootElement来注释公共类:这次wsgen识别了自定义命名空间,并为每个wsdl生成了一个XSD,但没有在任何地方包含单个(公共)xsd.
有人能指出我这个问题的解决方案吗?
我一直在网上寻找好几个小时,试图找到一种简单的方法来验证针对WSDL的完整SOAP消息.我知道有很多方法可以使用各种Web服务框架来实现这一点,但我不想这样做,因为要求只是验证一段XML.我可以验证模式,虽然我遇到的问题是有很多模式导入到WSDL中,我不知道应该验证哪一个模式.我可以编写一些实用程序来首先处理WSDL和响应以确定要对哪个XSD进行验证,但我认为这可以使用已建立的库作为单行程完成!
有没有人知道在给定WSDL和多个XSD的情况下验证XML文档的相对简单的方法?
我的解决方案中有一些Wcf服务库项目(不是Wcf服务应用程序).我必须将项目的.wsdl文件提供给我的同事,他们将使用这些服务.
我怎样才能做到这一点?
提前致谢,
使用Axis2 Wsdl2Java:有没有办法从wsdl生成相关的客户端代码,但只能用于wsdl中受支持的操作的子集.
也就是说,如果wsdl说过一个有争议的操作,那么只能为一个或两个感兴趣的操作生成客户端存根代码?
我已经为客户WSDL生成了客户端存根,并且生成的存根和支持代码对于我的目的来说太大了> 75MB.
我使用了带有-U选项的Axis2 Wsdl2Java来解压缩绑定,并且由于在尝试使用ADB时出现解析错误,我还必须使用XML bean绑定.
谢谢,
由于我没有收到太多关于此的反馈:我将编辑这个来重述问题,(因为我真的不关心解决方案是如何得出的).
基本上我真正的问题是我正在生成一个相当大的WAR文件,该文件在Tomcat7.0中使用客户端并且它消耗了大量内存.
也许,我不需要/不应该在WAR中捆绑所有生成的类.但在我看来,这些是Stub生成的不可或缺的部分,我相信有一个更优雅的解决方案,而不是我手动挑选出来的东西?
所以我想以另一种方式重述问题:Axis2正在生成一个非常大的WAR文件,它消耗了大量的Tomcat资源.如何缩小此WAR以使其更小/"更轻量级"WAR.
谢谢,
我是Web服务的新手.我需要调用一个Web服务,其定义在http://api.search.live.net/search.wsdl中.我需要使用此Web服务搜索任何关键字.我在网上搜索但找不到任何解决方案.知道如何调用Web服务.我需要使用Java.
我尝试生成WSDL,然后使用客户端手动在WSDL中找到每个XSD.该服务目前只在我的本地主机上,尚未发布.
客户端收到以下错误:
该文件已被理解,但无法处理.WSDL文档包含无法解析的链接.下载'http:// localhost:xxxx/MyService.svc?xsd = xsd0'时出错.无法连接到远程服务器无法建立连接,因为目标计算机主动拒绝它127.0.0.1:xxxx
如何生成和共享服务WSDL和XSD,以便他们可以开始编写客户端(无需访问服务atm?
编辑 WSDL/XSD中与这些问题相关的问题
WSDL
<xsd:schema targetNamespace="http://tempuri.org/Imports">
<xsd:import schemaLocation="http://localhost:xxxx/MyService.svc?xsd=xsd0"
namespace="http://tempuri.org/"/>
<xsd:import schemaLocation="http://localhost:xxxx/MyService.svc?xsd=xsd1"
namespace="http://schemas.microsoft.com/2003/10/Serialization/"/>
<xsd:import schemaLocation="http://localhost:xxxx/MyService.svc?xsd=xsd2"
namespace="**MYNAMESPACE**"/>
</xsd:schema>
Run Code Online (Sandbox Code Playgroud)
XSD
<xs:import schemaLocation="http://localhost:xxxx/MyService.svc?xsd=xsd1"
namespace="http://schemas.microsoft.com/2003/10/Serialization/"/>
Run Code Online (Sandbox Code Playgroud)
编辑2:
感谢@The Indian Programmmer
我能够生成一个代理类来使用此命令进行编程:
"C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\svcutil.exe" -noconfig -namespace:*,SERVICE.INTERFACE.NAMESPACE -serializer:datacontractserializer https://My-PC/SvrLocation/MyService.svc?wsdl
(托管在本地IIS中)
好吧,我有一个奇怪的问题,我今天在谷歌和雅虎寻找解决方案近4个小时.我拼命寻找解决方案.
public static String [] checkCardAccount(String cardNumber, String cardIssuer, String securityNumber){
URL url = null;
try {
url = new URL("http://localhost:8999/bankcard?wsdl");
} catch (MalformedURLException e) {
e.printStackTrace();
}
QName qname = new QName("http://server.bcard.soap.com/","BankCardImplService");
Service service = Service.create(url,qname);
BankCard bankcard = service.getPort(BankCard.class);
return bankcard.getCardClientData(cardNumber, cardIssuer);
}
Run Code Online (Sandbox Code Playgroud)
上面的代码是我访问SOAP服务的客户端,它确实可以在一个独立的java应用程序中运行,但是当我将它嵌入到我的Java Struts应用程序时,它会在下面显示以下错误
javax.xml.ws.WebServiceException:未定义的端口类型:com.com的com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:349)上的{http://bankcard.api.com/}BankCard位于com.api.bankcard.BankCardClient.checkCardAccount(BankCardClient)的javax.xml.ws.Service.getPort(Service.java:161)中的.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:355) .java:25)在org.apache.struts的org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58)的com.action.CardregAction.execute(CardregAction.java:18).在org.apache.commons.chain.impl.ChainBase.execute中的org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)上的chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67) ChainBase.java:191)在org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:305)位于org.apache.smons.chain.ComposableRequestProcessor的org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191).位于org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)的进程(ComposableRequestProcessor.java:283)位于javax.servlet的org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462) .http.HttpServlet.service(HttpServlet.java:637),位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)的javax.servlet.http.HttpServlet.service(HttpServlet.java:717) Org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)at org.apache.catalina.valves.ErrorReportValve .invoke(ErrorReportValve.java:102)org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)org. apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:588)at org.apache.tomcat.util.net.JIoEndpoint $ java.lang.Thread.run上的Worker.run(JIoEndpoint.java:489)(Thread.java:662)apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve. java:109)org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)at org.apache.coyote.http11 .http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:588)atg.apache.tomcat.util.net.JIoEndpoint $ Worker.run(JIoEndpoint.java:489)at java.lang.Thread.run(Thread.java:662 )apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve. java:109)org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)at org.apache.coyote.http11 .http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:588)atg.apache.tomcat.util.net.JIoEndpoint $ Worker.run(JIoEndpoint.java:489)at java.lang.Thread.run(Thread.java:662 )org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)上的StandardEngineValve.invoke(StandardEngineValve.java:109)位于org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)org …
我在Eclipse中用Java编写了一个简单的WSDL Web服务.以下是该服务的Java代码原型:
public static String vriteAnnouncement(String title, String body){
...
}
Run Code Online (Sandbox Code Playgroud)
我使用Microsoft wsdl.exe
工具为此WSDL服务生成了一个代理类,并使用Developer Command Prompt Visual Studio 2012中的以下命令将其设为dll:
wsdl /l:CS /protocol:SOAP WriteAnnouncement.wsdl
csc /t:library /r:System.Web.Services.dll /r:System.Xml.dll WriteAnnouncementService.cs
Run Code Online (Sandbox Code Playgroud)
在我的Windows 8商店应用程序中,我添加了对此dll的引用,然后在MainPage.xaml.cs中添加了以下代码:
WriteAnnouncementService was = new WriteAnnouncementService();
Run Code Online (Sandbox Code Playgroud)
当我尝试运行该应用程序时,我收到此错误:
类型'System.Web.Services.Protocols.SoapHttpClientProtocol'在未引用的程序集中定义.
您必须添加对程序集'System.Web.Services,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'的引用.
C:\ Users ...\MainPage.xaml.cs第27行第13列
然后我添加了对System.Web.Service的引用并重新构建了应用程序.现在我收到以下错误:
无法解析类型为"System.Web.Services.Protocols.WebClientProtocol"的程序集"System,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089"中的基类或接口"System.ComponentModel.Component" :\ Program Files(x86)\ Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\System.Web.Services.dll
第一篇文章,请原谅任何违反论坛规则的行为等.我正在尝试使用DHL api来跟踪货件.
这是我目前的代码
$client = new SoapClient("https://wsbuat.dhl.com:8300/gbl/glDHLExpressTrack?wsdl");
//$header = new SoapHeader("https://wsbuat.dhl.com:8300/gbl/glDHLExpressTrack?wsdl", "APICredentials", $auth, false);
//$client->__setLocation('https://wsbuat.dhl.com:8300/gbl/glDHLExpressTrack?wsdl');
$header_part = '<soapenv:Envelope xmlns:rat="https://wsbuat.dhl.com:8300/gbl/glDHLExpressTrack?wsdl"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wsswssecurity-
secext-1.0.xsd">
<wsse:UsernameToken wsu:Id="UsernameToken-5" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-
wss-wssecurity-utility-1.0.xsd">
<wsse:Username>myusername</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-
1.0#PasswordText">mypassword</wsse:Password>
<wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-
1.0#Base64Binary">eUYebYfsjztETJ4Urt8AJw==</wsse:Nonce>
<wsu:Created>2010-02-12T17:40:39.124Z</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>';
$soap_var_header = new SoapVar( $header_part, XSD_ANYXML, null, null, null );
$soap_header = new SoapHeader( 'https://wsbuat.dhl.com:8300/gbl/glDHLExpressTrack', 'wsse', $soap_var_header, true );
$client->__setSoapHeaders($soap_header);
Run Code Online (Sandbox Code Playgroud)
如果我做
后续代码var_dump($客户 - > __ getFunctions())
我得到以下内容:
array(1) { [0]=> string(83) "trackShipmentRequestResponse trackShipmentRequest(trackShipmentRequest $parameters)" }
Run Code Online (Sandbox Code Playgroud)
我的问题是,是否有人知道如何格式化trackShipmentRequest
$client->trackShipmentRequest(what goes here);
Run Code Online (Sandbox Code Playgroud)
这是DHL给我用于soapui的xml的一个例子 …
之间的关系是什么:
......特别是location
前者的schemaLocation
属性与后者的属性之间的关系?
虽然我可以使用目录文件(在JAX-WS/wsimport
工具链中)来"覆盖" 元素的schemaLocation
属性,xsd:import
但似乎我不能location
对wsdl:import
语句的属性执行相同的操作.