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

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

作者:互联网

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

Web服务会很棒,但我们基础架构上唯一支持的Java应用程序服务器是WebSphere 6.1.这意味着古老的(并且已弃用的)JAX-RPC Web服务框架是我们公开Web服务的唯一方式.只是简单的概念验证在这里工作一直是一场噩梦(因为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)获取所需的参数并调用您的第三方代码,并将其作为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共有的“祝福”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中添加以下代码段:

    <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 for Java EE Developers和WSDCi中的Web服务工具.

希望这可以帮助你:)

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

标签:java,ipc,interop,application-server,c-2
来源: https://codeday.me/bug/20191007/1863813.html