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

我处于困境:我们有一个第三方企业系统,它公开了一个基于Java的API。 但是,我们是一个100%.Net导向的开发团队。 本质上,我需要用C#代码可以调用的东西包装Java API。

Web服务会很棒,但我们基础架构上唯一支持的Java应用程序服务器是WebSphere 6.1。 这意味着古老的(并且已弃用的)JAX-RPC Web服务框架是我们公开Web服务的唯一方式。 只是在这里获得一个简单的概念validation一直是一场噩梦(因为Java缺乏经验,WebSphere很糟糕,JAX-RPC很笨重,而且很多JAR地狱)。

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

使用某些Web服务包装此库的最轻量级方法是什么?

是。

如果您可以创建一个1)使用@WebMetod注释的Java方法,并且2)获取所需的参数并调用您的第3方代码,并将其包装为Web应用程序,您可以使用Metro堆栈 – https:/ /metro.dev.java.net/ – 使用任何Servlet 2.5 Web容器(将其放在Web容器全局lib文件夹中)将上述方法公开为Web服务。 我们正在使用嵌入式Jetty,但我已经validation了这适用于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共有的“祝福”jar文件夹的文件夹中 – 我相信它是$ { TOMCAT} / lib for Tomcat 6. [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中添加以下代码段:
     <听者>
     <监听级> com.sun.xml.ws.transport.http.servlet.WSServletContextListener 
     
      JAX-WS端点 - 此servlet必须处理所有端点
     <显示名称> web服务
      web服务
      com.sun.xml.ws.transport.http.servlet.WSServlet 
     <负载上启动> 1 
     

     <! - 每个端点必须具有到JAX-WS端点servlet的映射 - >

     
      web服务
      / WS 
     
  • 创建一个新文件WEB-INF / sun-jaxws.xml:
     
         
         
  • 确保部署中包含web.xml和sun-jaxws.xml!

  • 完成!

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

希望这可以帮到你:)

[1]不使它们成为全局会给你类加载器问题!

关于如何运行其他内容的问题,我不太明白你的声明“我们的基础架构上支持的唯一Java应用程序服务器是WebSphere 6.1”。 但不,您不需要完整的App Server来公开Web服务。

我认为这是一个很好的起点: http : //docs.codehaus.org/display/JETTY/J2se6HttpServerSPI

由于您无法更新JDK的版本,因为我希望您与WebSphere所需的内容相关联,因此您可能需要尝试从apache尝试轴famework。

这需要你编写一个只传递java代码调用的web服务,但它应该为你提供上线工具,并且它适用于旧版本的java。

我希望Jax-WS会成为一个问题,除非你至少在JDK5上有一些奇迹,然后JAX-WS会有所帮助,因为注释使得开发更像是.NET 2.0下的web服务模型。

我最终找到了一个比上述任何一个都容易得多的解决方案。 我们使用@javax.jws.WebService@javax.jws.WebMethod注释创建了一些简单的类(比如@ThorbjørnRavnAndersen的答案中的doPing()方法),然后使用以下方法部署它们:

 string url = "http://localhost:8282/MyService" MyService serviceInstance = new MyService(); Endpoint svc = Endpoint.publish(url, serviceInstance); 

然后我能够在http://localhost:8282/MyService?wsdl指向Visual Studio并生成一个客户端。 非常简单。

我们在很长一段时间内通过这项服务运行了很多请求,并没有发现任何问题。 我们使用Java Service Wrapper将其包装起来,以便在重新启动/ JVM崩溃等时重新启动它。这是一个穷人的应用程序服务器。

我希望这可以帮助任何其他希望与Java互操作的.NET开发人员,而不必重新映射你的大脑。