java调用.Net WCF服务的讲解

WCF服务配置成wsHttpBinding+certificate证书加密+自定义的用户名密码检验功能。在服务的访问上用了https协议,个人也没做过java平台和.Net Web Service的整合。而且https无疑增加了这个难度。

所以刚开始的想法是通过asp.net网页来访问服务,再利用网页来给java,android返回xml。这样利用http避免了平台的不兼容性。

缺点是各种业务的增加删除不紧要在Web Service中增加,还要在网页中增加。

而后来由于另外几个同学迟迟没有开始做应用端,导致业务无法预料,时间越脱越长。

个人觉得时间可能有点紧,就想把框架简单化,直接让java端和andriod客户端调用WCF服务。

于是清明放假这几天改造了一下程序框架,网络上参考了各种文章,终于调试成功了。

废话不说了,看代码。

首先,最简单的服务,没有certificate,没有自定义的用户名密码检验,只有wsHttpBinding。

WCF服务配置程序如下:

[xhtml]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8" ?>  
  2. <configuration>  
  3.   <system.serviceModel>  
  4.     <behaviors>  
  5.         
  6.       <serviceBehaviors>  
  7.         <behavior name="httpsBasicBindings">  
  8.           <serviceMetadata httpGetEnabled="false" httpGetUrl="http://127.0.0.1:8889/test" />  
  9.           <serviceDebug includeExceptionDetailInFaults="true" />  
  10.         </behavior>  
  11.       </serviceBehaviors>  
  12.     </behaviors>  
  13.     <services>  
  14.       <service behaviorConfiguration="httpsBasicBindings" name="TestService.TestService">  
  15.         <endpoint address="" binding="basicHttpBinding" bindingConfiguration="test1" contract="TestService.ITestService">  
  16.         </endpoint>  
  17.         <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />  
  18.       </service>  
  19.     </services>  
  20.     <bindings>  
  21.       <basicHttpBinding>  
  22.         <binding name="test1">  
  23.           <security mode="Transport">  
  24.             <transport clientCredentialType="None"/>  
  25.           </security>  
  26.         </binding>  
  27.       </basicHttpBinding>  
  28.     </bindings>  
  29.   </system.serviceModel>  
 

java客户端调用程序:(用axis2-1.4.1生成,生成方法cmd下 axis2的bin目录下 wsdl2java -uri http://localhost:8889/test?wsdl)

[java]  view plain  copy
  1.       
  2.       
  3.     TestServiceStub.GetSysTime paraGetSysTime=new TestServiceStub.GetSysTime();       
  4.     try {  
  5.           
  6.         TestServiceStub.GetSysTimeResponse response = client.GetSysTime(paraGetSysTime);  
  7.         resultString=response.getGetSysTimeResult();  
  8.     } catch (RemoteException e) {  
  9.         // TODO Auto-generated catch block  
  10.         e.printStackTrace();  
  11.     }  
  12. catch (AxisFault e) {  
  13.     // TODO Auto-generated catch block  
  14.     e.printStackTrace();  
  15. }  
  16. System.out.print(resultString);  
 

结果调用失败,一直是什么read time out,超时。网查查阅资料,说这么设置就可以了。

[java]  view plain  copy
  1. client._getServiceClient().getOptions().setTimeOutInMilliSeconds(5*60*1000);  
 

于是设置,结果还是超时。继续找资料。发现都是说超时。当时那个崩溃啊~~好在翻了10页google,终于找到一篇说是java不支持wshttpbinding协议。因为wshttpbinding是微软在SOAP1.0基础上改进过的,不是通用的绑定协议。这里又补充了下理论知识,呵呵~~于是改为basicHttpBinding。

WCF服务配置(basicHttpBinding)

[xhtml]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8" ?>  
  2. <configuration>  
  3.   <system.serviceModel>  
  4.     <behaviors>  
  5.         
  6.       <serviceBehaviors>  
  7.         <behavior name="httpsBasicBindings">  
  8.           <serviceMetadata httpGetEnabled="true" httpGetUrl="http://127.0.0.1:8889/test" />  
  9.           <serviceDebug includeExceptionDetailInFaults="true" />  
  10.             
  11.         </behavior>  
  12.       </serviceBehaviors>  
  13.     </behaviors>  
  14.     <services>  
  15.       <service behaviorConfiguration="httpsBasicBindings" name="TestService.TestService">  
  16.         <endpoint address="" binding="basicHttpBinding" bindingConfiguration="test1" contract="TestService.ITestService">  
  17.         </endpoint>  
  18.         <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />  
  19.       </service>  
  20.     </services>  
  21.     <bindings>  
  22.       <basicHttpBinding>  
  23.         <binding name="test1">  
  24.           <security mode="Transport">  
  25.             <transport clientCredentialType="None"/>  
  26.           </security>  
  27.         </binding>  
  28.       </basicHttpBinding>  
  29.     </bindings>  
  30.   </system.serviceModel>  
  31. </configuration>  
 

然后重新用axis2 生成客户端代理。调用代码,果然成功。调用代码不变。

调用结果图:

调用结果

 

下面是axis2生成的客户端代理结构图。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苍狼_2001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值