gpt4 book ai didi

c# - 在没有 Java EE 应用程序服务器的情况下使用 Web 服务在 C# 和 Java 之间进行互操作?

转载 作者:行者123 更新时间:2023-11-30 22:48:23 25 4
gpt4 key购买 nike

我处境艰难:我们有一个公开基于 Java 的 API 的第 3 方企业系统。然而,我们是一个 100% 面向 .Net 的开发团队。本质上,我需要用 C# 代码可以调用的东西来包装 Java API。

Web 服务会很棒,但我们的基础架构上唯一支持的 Java 应用程序服务器是 WebSphere 6.1。这意味着古老的(已弃用的)JAX-RPC Web 服务框架是我们公开 Web 服务的唯一方式。只是在这里进行简单的概念验证已经是一场噩梦(因为 Java 经验不足,WebSphere 很糟糕,JAX-RPC 很笨拙,还有很多 JAR hell )。

JAVA EE 5 中新的 JAX-WS 2.0 Web 服务框架看起来很棒——有没有办法在没有整个 Java 应用程序服务器的情况下运行它?例如,在 .Net 的 WCF(Windows 通信框架)中,您几乎可以在任何地方托管服务(进程内、Windows 服务、IIS 6/7 等)。

用一些 Web 服务包装这个库的最轻量级方法是什么?

最佳答案

是的。

如果您可以创建一个 Java 方法,该方法 1) 用 @WebMetod 注释 2) 获取所需的参数并调用您的第 3 方代码,并将其包装为 Web 应用程序,您可以使用 Metro 堆栈 - https://metro.dev.java.net/ - 使用任何 Servlet 2.5 Web 容器(将其放在 Web 容器全局 lib 文件夹中)以将上述方法公开为 Web 服务。我们使用的是嵌入式 Jetty,但我已经验证它适用于 Tomcat。

我在 http://archive.midrange.com/java400-l/200904/msg00071.html 中写下了我的发现


我从 https://metro.dev.java.net/1.4/ 下载了 Metro 1.4 (1.5 版本很新,我没看过),最终解压成几个 jar 文件。

将 webservices-api.jar、webservices-rt.jar、webservices-extra-api.jar 和 webservices-extra.jar(四个文件)复制到包含所有 tomcat 通用的“blessed”jar 文件的文件夹中 - 我相信它对于 Tomcat 6 是 ${TOMCAT}/lib。[1]

在您的 Eclipse 项目中最终成为一个 WAR 文件:

  • 如果您的工作区 JRE 是 Java 5,则必须将 webservices-api.jar 添加到类路径中(最后不应部署它)。如果是 Java 6 你应该可以跳过这一步。

  • 创建类 foo.Ping 如下所示:


package foo;

import java.net.InetAddress;
import java.net.UnknownHostException;

/**
Ping is a simple web service class providing a "yes, we have contact" class.
Currently the doPing() method provides a response with the host name and
address (if available) and the current server time.

*/
@javax.jws.WebService
public class Ping {

@javax.jws.WebMethod(action = "doPing")
public String doPing() {
System.out.println("Ping.doPing() called.");

String hostName;
try {
hostName = InetAddress.getLocalHost().getHostName();
} catch (UnknownHostException e) {
hostName = "unknown (" + e.getMessage() + ")";
}

String hostAddress;
try {
hostAddress = InetAddress.getLocalHost().getHostAddress();
} catch (UnknownHostException e) {
hostAddress = "unknown (" + e.getMessage() + ")";
}

return "Reached '" + hostName + "' (" + hostAddress + ") at "
+ new java.util.Date() + " java.version="
+ System.getProperty("java.version", "(not set)");
}
}

  • 在您的 WEB-INF/web.xml 中添加此代码段:
    <listener>    <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>    </listener>    <servlet>    <description>JAX-WS endpoint - this servlet must handle all endpoints</description>    <display-name>webservice</display-name>    <servlet-name>webservice</servlet-name>    <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>    <load-on-startup>1</load-on-startup>    </servlet>    <!-- each endpoint must have a mapping to the JAX-WS endpoint servlet -->    <servlet-mapping>    <servlet-name>webservice</servlet-name>    <url-pattern>/ws</url-pattern>    </servlet-mapping>
  • 创建一个新文件 WEB-INF/sun-jaxws.xml:
    <endpoints xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime' version='2.0'>        <endpoint name='ping' implementation='foo.Ping'url-pattern='/ws'>        </endpoint    </endpoints>
  • 确保 web.xml 和 sun-jaxws.xml 都包含在部署中!

  • 完成!

现在将你的war文件部署到上面准备好的Tomcat中,并在你部署的web应用下打开“/ws”。这可能是 http://localhost:8080/foo/ws;。这将为您提供一个包含所有 Web 服务(包括 Ping)的 WSDL 链接的信息页面。此链接可直接在任何 WSDL 处理工具中使用,包括 Eclipse IDE 中面向 Java EE 开发人员和 WSDCi 的 Web 服务工具。

希望这对你有帮助:)

[1] 不将它们设为全局会给您带来类加载器问题!

关于c# - 在没有 Java EE 应用程序服务器的情况下使用 Web 服务在 C# 和 Java 之间进行互操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1703951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com