【问题标题】:Creating JAX-WS Client to utilize .NET web service (authentication required)创建 JAX-WS 客户端以利用 .NET Web 服务(需要身份验证)
【发布时间】:2013-01-17 23:01:43
【问题描述】:

正如我在标题中所说,我正在尝试将 JAVA 应用程序连接到远程 Web 服务。我对 JAVA 和 Web 服务还很陌生。我正在使用 Eclipse IDE。

我做的第一件事是在命令窗口中运行 wsimport。提供了 WSDL 网址,但出现错误:FAILED,找不到 WSDL。我检查了多次以确保 url 是正确的。

为了解决这个问题,我在本地保存了 WSDL,然后 wsimport 没有任何问题。将所有生成的代码移到我的项目中,一切似乎都很好。

这是我的测试代码

// HAVE TO USE PROXY
final String authUser = "xxxxxx";
final String authPassword = "xxxxxx";
String proxyServer = "proxy1.xxxxx.com";
String proxyPort = "99999";

System.setProperty("http.proxyHost", proxyServer);
System.setProperty("http.proxyPort", proxyPort);
System.setProperty("http.proxyUser", authUser);
System.setProperty("http.proxyPassword", authPassword);

Authenticator.setDefault(
   new Authenticator() {
      public PasswordAuthentication getPasswordAuthentication() {
          return new PasswordAuthentication(authUser, authPassword.toCharArray());
      }
   }
);

WebServiceXX client = new WebServiceXX();
WebServiceXXSoap port = client.getPort(WebServiceXXSoap.class);

BindingProvider bp = (BindingProvider)port;
Map<String, Object> req_ctx = bp.getRequestContext();

req_ctx.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "https://domain.com/WebService/WebServiceXX.asmx");
req_ctx.put(BindingProvider.USERNAME_PROPERTY, "user");
req_ctx.put(BindingProvider.PASSWORD_PROPERTY, "password");

//HERE, TRYING TO CALL SERVICE. GETTING TIMEOUT ERROR IN 2nd LINE
WebServiceXXSoap service = client.getWebServiceXXSoap();
OperationStatusCodesResp StatusCodes = service.GetOperationStatusCodes();

简而言之,我不得不使用代理服务器。我测试了那部分,似乎没问题。 由于我使用本地 WSDL,我假设我必须手动设置 ENDPOINT URL,并且由于需要身份验证,所以我必须设置用户名和密码,如您在代码中看到的那样。

我得到的错误是超时错误。我在想,也许我没有正确设置此 ENDPOINT,并且由于没有提供正确的 Web 服务 URL,因此无法发出该请求。

我尝试在其中一个生成的 java 文件中编辑 wsdlLocation,以用真实的 WSDL url 替换本地路径,但是我收到了找不到 WSDL 的错误。 JAX-WS 要么讨厌这个 WSDL,要么就是其他问题。作为说明,我在 .NET (C#) 应用程序中使用此服务没有任何问题(Web 服务本身在 .NET、WSE 2.0 中完成)

有什么想法吗?

谢谢

【问题讨论】:

  • 好吧,我的客户端无法加载 WSDL (https) 的原因是因为代理设置为 http 而不是 https。所以,我需要添加: System.setProperty("https.proxyHost", proxyServer); System.setProperty("https.proxyPort", proxyPort);进入上面的代码

标签: java web-services jax-ws endpoint


【解决方案1】:

您可以尝试将@WebServiceClient注解的wsdlLocation和变量baseUrl更改为。

https://domain.com/WebService/WebServiceXX.asmx?WSDL

关于身份验证(基本),您可以在HTTP basic authentication with JAX-WS (Client) 中找到一个很好的指南。

编辑

您可以尝试在您的项目中本地存储 WSDL。要生成客户端,您可以将 WSDL 文件放在一个文件夹中,然后使用终端 o 符号系统导航到该文件夹​​,将 PATH 设置为指向 JDK 的 bin 文件夹,并将 wsimport 与本地 wsdl 一起使用文件。

查看Consuming a Web Service with Java 6 and JAX-WS - Wiki - Confluence 中的示例。

那么就可以使用指定端点地址和HTTP基本授权部分中的方式了。

【讨论】:

  • 谢谢。我尝试更改 wsdlLocation。我会收到找不到 WSDL 的错误消息。此外,当我使用 wsimport 并提供 WSDL url 时,我收到 url 不存在的消息。我尝试使用 Putty 连接到此位置,但出现相同的错误“主机不存在”。防火墙?
  • 好的,我的 wsimport 无法读取 WSDL url 的部分是代理问题。我现在想弄清楚如何在命令提示符下设置代理。但是,这仍然不能解释为什么当我设置代理和定义 Web 服务端点时 java 代码超时。
  • 您的最后一个链接 - 我的代理服务器需要身份验证。无法提供用户名并传递给 wsimport。试过-httpproxy:user:pass@host:port,没用。
猜你喜欢
  • 2017-03-02
  • 1970-01-01
  • 2011-09-26
  • 1970-01-01
  • 1970-01-01
  • 2012-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多