用java调用.net的wcf其实还是很简单的

     前些天和我们的一个邮件服务商对接,双方需要进行一些通讯,对方是java团队,而作为.net团队的我们,只能公布出去的是一个wcf的basicbinding,想不

到问题来了,对方不知道怎么去调用这个basic,可能他们水平有点菜,有点尴尬,不得已我来研究研究,其实只要知道公布的wsdl,对什么语言都是很简单的。

 

一:案例

      为了方便,我也不特意写什么代码了,就用vs里面的wcf服务模板创建一下,详细内容如下:

 1     // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“Service1”。
 2     // 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择 Service1.svc 或 Service1.svc.cs,然后开始调试。
 3     public class Service1 : IService1
 4     {
 5         public string GetData(int value)
 6         {
 7             return string.Format("You entered: {0}", value);
 8         }
 9 
10         public CompositeType GetDataUsingDataContract(CompositeType composite)
11         {
12             if (composite == null)
13             {
14                 throw new ArgumentNullException("composite");
15             }
16             if (composite.BoolValue)
17             {
18                 composite.StringValue += "Suffix";
19             }
20             return composite;
21         }
22     }

 

        然后F5运行一下,就可以看到这样的一个wcf测试客户端,有服务地址,有提供的两个方法契约。

 

 

二:java调用

1. 使用web service client

     其实在eclipse的新建项目中有一个Web Service Client 模板,这个里面就可以将wsdl转换为proxy的java代码,有一点像C#中的服务引用,是不是,

下面就一步一步操作下:

《1》 新建一个java project,或者dynamic web project都是可以的,本次测试只新建一个MyJavaTest 的project。

 

《2》 然后使用 WebService Client的模板 File  => Other =>Web Services => Web Service Client 即可。

 

《3》在Service definition 选项中输入我们的wcf服务地址:http://localhost:54248/Service1.svc?wsdl,一定要注意

         在svc后面加上一个wsdl,这样就方便java proxy找到哈,然后左下角有一个“温度计”,调到start client 模式就

        好,然后继续点击下步,详细如下图:

 

《4》 下图就表示生成好的代码将放入到哪一个目录下,这个没什么好说的。

 

《5》然后点击finish,现在你会发现,你多了几个自动化的java类,便捷性和visual studio有的一拼。

 

好了,自动化的类都出来了,接下来我只需要新建了一个入口的Program类,是不是就可以敲定了。。。

 1 package com.datamip;
 2 
 3 import java.rmi.RemoteException;
 4 
 5 import org.tempuri.IService1Proxy;
 6 
 7 public class Program {
 8 
 9     public static void main(String[] args) throws RemoteException {
10 
11         IService1Proxy proxy = new IService1Proxy();
12 
13         String result = proxy.getData(12345);
14 
15         System.out.println(result);
16     }
17 
18 }

不过要吐槽的是,IService1Proxy居然是一个类,我还以为是接口呢,思维定势吧~~~

 

2. 使用wsimport小工具

        其实java的jdk里面有很多的实用小工具,其中就有一款wsimport.exe,它就可以用来根据wsdl生成自动化的proxy类,和.net的svcutil的功能

是一样的。

 

  由于jdk路径都配置到了环境变量中,就可以在cmd中看一下wsimport需要的参数。

C:\Users\hxc>wsimport
缺少 WSDL_URI用法: wsimport [options] <WSDL_URI>\其中 [options] 包括:-b <path>                 指定 jaxws/jaxb 绑定文件或附加模式(每个 <path> 都必须具有自己的 -b)-B<jaxbOption>            将此选项传递给 JAXB 模式编译器-catalog <file>           指定用于解析外部实体引用的目录文件支持 TR9401, XCatalog 和 OASIS XML 目录格式。-d <directory>            指定放置生成的输出文件的位置-encoding <encoding>      指定源文件所使用的字符编码-extension                允许供应商扩展 - 不按规范指定功能。使用扩展可能会导致应用程序不可移植或无法与其他实现进行互操作-help                     显示帮助-httpproxy:<host>:<port>  指定 HTTP 代理服务器 (端口默认为 8080)-keep                     保留生成的文件-p <pkg>                  指定目标程序包-quiet                    隐藏 wsimport 输出-s <directory>            指定放置生成的源文件的位置-target <version>         按给定的 JAXWS 规范版本生成代码默认为 2.2, 接受的值为 2.0, 2.12.2例如, 2.0 将为 JAXWS 2.0 规范生成兼容的代码-verbose                  有关编译器在执行什么操作的输出消息-version                  输出版本信息-wsdllocation <location>  @WebServiceClient.wsdlLocation 值-clientjar <jarfile>      创建生成的 Artifact 的 jar 文件以及调用 Web 服务所需的 WSDL 元数据。-generateJWS              生成存根 JWS 实现文件-implDestDir <directory>  指定生成 JWS 实现文件的位置-implServiceName <name>   生成的 JWS 实现的服务名的本地部分-implPortName <name>      生成的 JWS 实现的端口名的本地部分\扩展:-XadditionalHeaders              映射标头不绑定到请求或响应消息不绑定到Java 方法参数-Xauthfile                       用于传送以下格式的授权信息的文件:http://username:password@example.org/stock?wsdl-Xdebug                          输出调试信息-Xno-addressing-databinding      允许 W3C EndpointReferenceType 到 Java 的绑定-Xnocompile                      不编译生成的 Java 文件-XdisableAuthenticator           禁用由 JAX-WS RI 使用的验证程序,将忽略 -Xauthfile 选项 (如果设置)-XdisableSSLHostnameVerification 在提取 wsdl 时禁用 SSL 主机名验证\示例:wsimport stock.wsdl -b stock.xml -b stock.xjbwsimport -d generated http://example.org/stock?wsdl
C:\Users\hxc>

这其中,大概知道下面4个参数就好说了。

《1》 url: 你需要生成代理类的数据源,也就是wsdl文件

《2》 -d:  生成的proxy文件需要存放的路径

《3》-p:   生成proxy类的包名。

《4》-keep:保存生成的文件名

接下来我们就cmd试一下:

C:\Users\hxc>wsimport http://localhost:54248/Service1.svc?wsdl -d c:\\2\\ -p com.datamip.proxy -keep
正在解析 WSDL...正在生成代码...正在编译代码...C:\Users\hxc>

 

好了,接下来就可以将“文件夹2”中的proxy类copy到project中,如下图:

 

看起来是不是很完美,那接下来要做的事情就是coding验证啦~~~

 

最后还有一种笨的方法,那就是通过fiddler抓取webservice通讯的参数,然后通过httppost模拟提交,也是可以的。。。好了,本篇就和大家说到

这里,希望对你有帮助。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288549.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php 使用PDO,防止sql注入 简单说明

PDO&#xff1a;php5 假如以下是一个简单的登录处理&#xff1a; 使用PDO连接mysql首先&#xff1a; 新建数据库 new PDO("mysql:hostlocalhost;dbnametest","root","root"); host:服务器 dbname:数据库名 后面两个分别是帐号和密码 默认…

DbTool 2.0.0 Released

DbTool 2.0.0 ReleasedIntroDbTool 一个支持 DbFirst、ModelFirst 和 CodeFirst 的数据库小工具。DbFirst 是根据数据库中的表信息生成代码中的 Model&#xff0c;以及生成数据表结构文档ModelFirst 是根据数据表信息或者数据表结构文档生成创建数据库的脚本CodeFirst 是指根据…

[蓝桥杯] 蚂蚁感冒

[蓝桥杯] 蚂蚁感冒 峰值内存消耗 < 256M  CPU消耗 < 1000ms 【题目描述 - Problem Description】 长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左&#xff0c;有的朝右。 每只蚂蚁都只能沿着杆子向前爬&#xff0c;速度是1厘米/秒。 当两只蚂蚁碰面时&#xff0…

Source Insight之Relation Window Properties配置和一些快捷键

1 Source Insight之Relation Window Properties配置 我们先点击source Insight的这个地方 然后鼠标右键&#xff0c;点击Relation Window Properties&#xff0c;配置如下 2 快捷键 目前就我知道的 1&#xff09;按亮和按熄这个变量 shift F8 2&#xff09;跳转到具体一行…

ArcGIS 10.2 Calculate Value(Data Management) 工具的使用

1、概述 Calculate Value tool returns a value based on a specified Python expression. 计算值工具返回一个基于特定Python表达式的值。 工具位置:ToolBox→Data Management Tools→General→Calculate Value 2、注意事项 (1)该工具只能用于MoudleBuilder,而不能用于Py…

omnicppcomplete php,VIM 常用法 (三)

这里描述常用的插件。1. NERD tree快捷键&#xff1a;o 在已有窗口中打开文件&#xff0c;并跳到该窗口go 在已有窗口中打开目录或文件&#xff0c;但不跳到该窗口i/s 在split/vsplit的新窗口打开文件&#xff0c;并跳到该窗口gi/si 在split/vslpit的新窗口打开文件&#xff0c…

android:versionCode和android:versionName 用途

Android的版本可以在androidmainfest.xml中定义&#xff0c;主要有android:versionCode和android:versionNameandroid:versionCode:主要是用于版本升级所用&#xff0c;是INT类型的&#xff0c;第一个版本定义为1&#xff0c;以后递增&#xff0c;这样只要判断该值就能确定是否…

js 深复制一个对象

自定义 cloneObj 方法 //深复制对象 var cloneObj function (obj) {var newObj {};if (obj instanceof Array) {newObj [];}for (var key in obj) {var val obj[key];newObj[key] typeof val object ? cloneObj(val) : val;}return newObj; }; 转载于:https://www.cnblo…

js (javascript) 中获取年月日信息

获取年月日的所有信息&#xff1a; 直接使用date(); 如要取得 其他单独年月日时间 &#xff1a; 首先创建一个date对象&#xff0c;例如 &#xff1a; var d new Date(); 随后例如取得当前年 &#xff0c;使用&#xff1a; d.getFullYear() 当前月使用 &#xff1a; d…

vb6编写dll读取dat文件_【STM32Cube_15】使用硬件I2C读取温湿度传感器数据(SHT30)...

寻求更好的阅读体验&#xff0c;请移步Mculover666的个人博客&#xff1a;【STM32Cube_15】使用硬件I2C读取温湿度传感器数据&#xff08;SHT30&#xff09;​www.mculover666.cn本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件I2C外设&#xff0c;读取SHT30温湿度…

windows之如何刷新电脑DNS缓存

1 问题 我在windows电脑里面的终端通过ping 泛域名&#xff0c;可以看到这个域名解析的地址&#xff0c;后面做了这个泛域名解析地址做了修改&#xff0c;但是我ping 这个泛域名地址的时候依然是之前的地址&#xff0c;然后我把终端关闭掉&#xff0c;再次ping这个地址&#x…

tcp/ip ---数据封装过程

转载于:https://www.cnblogs.com/saryli/p/5306721.html

NuGet 新特性 -- 中心化的 NuGet 包版本管理

NuGet 新特性 -- 中心化的 NuGet 包版本管理IntroNuGet 支持了一个可以中心化管理 NuGet 包版本的方案&#xff0c;我们可以在一个地方统一管理 NuGet 包的版本Preface在之前的版本中我们通常在每个指定包版本引用的地方会设置 NuGet 包的版本号&#xff0c;如果项目比较多&…

Java面向对象编程学习

1、新建一个工程&#xff0c;在工程下新建一个类Method01&#xff08;勾选创建main函数&#xff09; package ClassStudy;class Person {String name; //默认为nullint age; //默认为0//构造函数public Person(){namenull;age0;}//方法public void say(){System.out.println(&…

数据库oracle 别名不能更新,数据库oracle改成mysql后Hibernate不能使用别名问题

报错&#xff1a; [INFO ] 11:34:19.272 [http-apr-7081-exec-8] org.hibernate.type.StringType - could not read column value from result set: PK_ID; Column PK_ID not found. [WARN ] 11:34:19.274 [http-apr-7081-exec-8] o.h.util.JDBCExceptionReporter - SQL Error:…

sql 两表更新

UPDATE sale_origin_line set statecancel from sale_origin p,sale_origin_line q where p.idq.order_id and p.company_id3 and p.date<2017-08-01;转载于:https://www.cnblogs.com/1314520xh/p/7338592.html

查询工资最低的3名员工的职工工号、姓名和收入_普法课堂|你有多久没有收到工资条了?...

工资条对于现在的大多数劳动者而言&#xff0c;尤其是90、00后&#xff0c;可能是一个十分陌生的概念和事物&#xff0c;许多用人单位已经不再向劳动者发放&#xff0c;在司法实践中工资条越来越少的在庭审中予以呈现。工资条对于劳动者而言十分重要&#xff0c;即便未有用人单…

js(javascript)取得当前时间小时,分钟,秒 以及毫秒

首先 我们需要new一个date对象&#xff1a; var d new Date(); 随后&#xff0c;取得当前时间小时&#xff1a; d.getHours() 取得当前分钟&#xff1a; d.getMinutes()) 取得当前秒&#xff1a; d.getSeconds() 取得当前毫秒&#xff1a; d.getMilliseconds() 全部…

linux之通过tail命令动态跟踪日志文件里面的末尾信息

1 问题场景 比如在linux系统,我们服务端的错误日志在一个文件里面不断输入进去,我们需要动态查看,我们总不可能每次进行cat文件查看 2 tail命令和head命令 head命令默认是输出一个文件的最前面10行 tail命令默认是输出一个文件的最后面10行 1) -n参数 具体显示多少行 显示…

【鉴权/授权】基于角色的简单授权认证

微信公众号&#xff1a;趣编程ACE关注可了解.NET日常开发技巧。如需源码&#xff0c;请公众号留言 源码;上文回顾【鉴权/授权】一步一步实现一个简易JWT鉴权【鉴权/授权】自定义一个身份认证Handler授权小Demo前面两篇文章中&#xff0c;我利用简单的小例子实现了JWT授权、自定…