java调用.net asmx / wcf

时间:2022-04-23
本文章向大家介绍java调用.net asmx / wcf,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一、先用asmx与wcf写二个.net web service:

1.1 asmx web服务:asmx-service.asmx.cs

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Services;
 6 
 7 namespace WebServiceSample
 8 {
 9     /// <summary>
10     /// Summary description for asmx_service
11     /// </summary>
12     [WebService(Namespace = "http://yjmyzz.cnblogs.com/")]
13     [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
14     [System.ComponentModel.ToolboxItem(false)]
15     // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
16     // [System.Web.Script.Services.ScriptService]
17     public class asmx_service : System.Web.Services.WebService
18     {
19 
20         [WebMethod]
21         public string HelloWorld(String msg)
22         {
23             return "Hello " + msg + " !";
24         }
25     }
26 }

1.2 wcf服务:wcf-service.svc.cs

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Runtime.Serialization;
 5 using System.ServiceModel;
 6 using System.Text;
 7 using System.Web.Services;
 8 
 9 namespace WebServiceSample
10 {
11     // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "wcf_service" in code, svc and config file together.
12     // NOTE: In order to launch WCF Test Client for testing this service, please select wcf-service.svc or wcf-service.svc.cs at the Solution Explorer and start debugging.
13     [ServiceContract(Namespace="http://yjmyzz.cnblogs.com/")]
14     [ServiceBehavior(Namespace = "http://yjmyzz.cnblogs.com/")]
15     public class wcf_service
16     {
17         [OperationContract]
18         public String HelloWorld(String msg)
19         {
20             return "Hello " + msg + " !";
21         }
22     }
23 }

1.3 web.config采用默认设置:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <configuration>
 3   <system.web>
 4     <compilation debug="true" targetFramework="4.5.1" />
 5     <httpRuntime targetFramework="4.5.1" />
 6   </system.web>
 7   <system.serviceModel>
 8     <behaviors>
 9       <serviceBehaviors>
10         <behavior name="">
11           <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
12           <serviceDebug includeExceptionDetailInFaults="false" />
13         </behavior>
14       </serviceBehaviors>
15     </behaviors>
16     <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
17       multipleSiteBindingsEnabled="true" />
18   </system.serviceModel>
19 </configuration>

完成后,访问网址为:

http://localhost:16638/asmx-service.asmx

http://localhost:16638/wcf-service.svc

二、java端的调用:

2.1 pom.xml中先添加以下依赖项:

 1 <dependency>
 2             <groupId>org.apache.axis</groupId>
 3             <artifactId>axis</artifactId>
 4             <version>1.4</version>            
 5         </dependency>
 6 
 7         <dependency>
 8             <groupId>org.apache.axis</groupId>
 9             <artifactId>axis-jaxrpc</artifactId>
10             <version>1.4</version>            
11         </dependency>
12 
13         <dependency>
14             <groupId>wsdl4j</groupId>
15             <artifactId>wsdl4j</artifactId>
16             <version>1.6.3</version>            
17         </dependency>
18 
19         <dependency>
20             <groupId>commons-discovery</groupId>
21             <artifactId>commons-discovery</artifactId>
22             <version>0.5</version>            
23         </dependency>
24 
25         <dependency>
26             <groupId>commons-logging</groupId>
27             <artifactId>commons-logging</artifactId>
28             <version>1.1.3</version>            
29         </dependency>

2.2 asmx web service的调用:

先封装一个方法:

 1     String callAsmxWebService(String serviceUrl, String serviceNamespace,
 2             String methodName, Map<String, String> params)
 3             throws ServiceException, RemoteException, MalformedURLException {
 4 
 5         org.apache.axis.client.Service service = new org.apache.axis.client.Service();
 6         Call call = (Call) service.createCall();
 7         call.setTargetEndpointAddress(new java.net.URL(serviceUrl));
 8         call.setOperationName(new QName(serviceNamespace, methodName));
 9 
10         ArrayList<String> paramValues = new ArrayList<String>();
11         for (Entry<String, String> entry : params.entrySet()) {
12             call.addParameter(new QName(serviceNamespace, entry.getKey()),
13                     XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
14             paramValues.add(entry.getValue());
15         }
16 
17         call.setReturnType(XMLType.XSD_STRING);
18         call.setUseSOAPAction(true);
19         call.setSOAPActionURI(serviceNamespace + methodName);
20 
21         return (String) call.invoke(new Object[] { paramValues.toArray() });
22 
23     }

然后就可以调用了:

 1     @Test
 2     public void testCallAsmx() throws RemoteException, ServiceException,
 3             MalformedURLException {        
 4 
 5         Map<String, String> params = new HashMap<String, String>();
 6         params.put("msg", "yjmyzz");
 7 
 8         String result = callAsmxWebService(
 9                 "http://localhost:16638/asmx-service.asmx",
10                 "http://yjmyzz.cnblogs.com/", "HelloWorld", params);
11 
12         System.out.println(result);
13     }

2.3 wcf服务的调用:

这个要借助IDE环境生成代理类(或者用命令JAVA_HOMEbinwsimport.exe -s  c:testjavasrc http://xxx.com/xxx.svc?wsdl)

eclipse环境中,project上右击->New->Other->Web Service Client

输入wsdl的地址,注意:wcf会生成二个wsdl的地址,用xxx?singleWsdl这个,如下图:

直接Finish,会生成一堆java文件:

然后就能调用啦:

1     @Test
2     public void testCallWcf() throws RemoteException, ServiceException,
3             MalformedURLException {        
4         
5         Wcf_service_ServiceLocator locator = new Wcf_service_ServiceLocator();
6         locator.setBasicHttpBinding_wcf_serviceEndpointAddress("http://localhost:16638/wcf-service.svc");
7         System.out.println(locator.getBasicHttpBinding_wcf_service().helloWorld("jimmy"));         
8     }