CORBA简介
使用.NET开发corba应用
一、 什么是IIOP.NET
IIOP.NET 是通过使用基于corba的IIOP支持.NET、javaEE和corba组件实现无缝互操作的技术。如图1.1所示,这种解决方案依赖于.NET Remoting 体系结构的可扩展性,以提供透明的对象级的集成,同时不会导致网关或基于 SAOP 产品引起的性能上的开销。
图1.1
二、 为什么使用IIOP.NET
现今基于.net开发corba应用程序的工具主要有:janeva,IIOP.NET, Remoting.Corba。其中,janeva 是Borland公司发布的一个新产品,但其缺点是不开源,并且收费;Remoting.Corba 是一个开源的项目,但由于处于初始开发阶段,许多功能尚不具备,比如编译IDL文件,某些corba 类型参数也不支持;IIOP.NET 也是一个开源的开发项目,相关的功能也已经成熟,其优势主要体现在,
(1) 性能。IIOP 比SOAP 更轻量级,更有效;
(2) .NET Remoting通道像它连接的对象一样共享相同的进程,而且既不需要分开的网关, 也不需要另外的间接层;
(3) 可靠性。IIOP定义了至多一次调用的语法规则,确保方法调用只处理一次;
(4) 可用性。IIOP.NET提供了灵活强大的CORBA模型,被集成在直观的.NET Remoting 中。
三、 通过IIOP.NET 技术建立的一个系统集成解决方案
1. 建立IIOP.NET开发环境
(1) IIOP.NET下载地址:http://iiop-net.sourceforge.net/index.html;目录结构如图3.1。由于官方网站上只提供了该项目的源文件,故需要下载到本地后,进行手工编译,执行nmake命令,生成dll 文件,供程序引用。(编译前需要拷贝jdk/lib 目录下的ir.idl 和 orb.idl 文件到IIOP.NET的idl目录,编译完成后会在响应的工程文件夹中生成dll文件或exe文件,并加以使用。这里会使用到IIOPChannel.dll,以及IDLToCLSCompiler.exe 两个文件。编译方法参见解压包中的Readme.txt)
图3.1
将Microsoft Visual Studio 安装目录下的 VC\bin,添加到系统环境变量path中;(例如D:\Program Files\Microsoft Visual Studio 9.0\VC\bin)
(2) 编译IDL文件。执行命令 IDLToCLSCompiler hi hi.idl ; 命令执行完后,会生成hi.dll文件,里面为idl文件定义的一些接口。(命令详解网址:http://iiop-net.sourceforge.net/faq.html)
2. IIOP.NET实现客户端
使用IIOP.NET来实现客户端通过4个步骤完成:
(1) 为服务器对象生成IDL 描述;
(2) 使用 IIOP.NET 工具 IDLTOCLSCompiler 从IDL生成代理类;
(3) 注册IIOP.NET 通道;
(4) 使用代理类。
3. IIOP.NET实现服务器端
(1) 定义所需的接口,即IDL文件;
(2) 使用IDLTOCLSCompiler 命令从IDL文件生成代理类。例如IDLTOCLSCompiler ProxyClasses orb.idl ;最终生成ProxyClasses.dll,包含定义类型的代理类,所有文件必须在正确的目录下。
(3) 注册IIOP.NET 通道,连接服务器,访问远程对象,实现.NET Web 服务。
注册通道并获取对象的引用来配置 Web 服务,程序如下:
Public class Global:System.Web.HttpApplication{
Protected void Appplication_Start (Object sender, EventArgs e){
IiopChannel channel = new IiopChannel();//建立IIOP通道
m_factory=GetFactory(); //代理类
remotingServices.RegisterChannel(channel); //注册IIOP通道
CorbaInit init = CorbaInit.getInit(); //客户端corba初始化
NamingContext nameService =(NamingContext)init.Get- NameService(Host,port); //生成命名服务
NameComponent[] name = new NameComponent[] { new NameComponent(“Factory”), //绑定对象,服务
Factory factory=(Factory)nameService.resolve(name);//根据绑定的对象名称,获得对象
……
}
}
(4) 对象实现,提供服务。
四、 IIOP.NET开发深圳医保接口实例
1. IOR文件介绍
Interoperable Object Reference,可互操作对象引用;基于IOR能够实现CORBA对象定位。IOR 是一个数据结构,它提供了关于类型、协议支持和可用 ORB 服务的信息。
2. 编译IDL文件
执行命令IDLTOCLSCompiler hi hi.idl,会在IDLTOCLSCompiler.exe 所在目录生成hi.dll 文件。
3. 获取IOR文件
从http://as170.szsi.gov.cn/szsb/hisi.html 获取ior 文件,用于与服务器建立连接。
4. 添加项目引用
建立客户端项目,并添加之前生成的hi.dll 以及 IIOPChannel.dll 引用。
5. 客户端示例程序
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using Ch.Elca.Iiop;
using Ch.Elca.Iiop.Services;
using omg.org.CosNaming;
namespace hi.modMZ
{
class Program
{
static void Main(string[] args)
{
try
{
// 建立并注册IIOP通道,与服务器corba进行通信
IiopClientChannel channel = new IiopClientChannel();
ChannelServices.RegisterChannel(channel,false);
//本地corba初始化
CorbaInit init = CorbaInit.GetInit();
//ior文件中内容,也可从ior文件中读取
string ior = “IOR:000000000000002B49444C3A6F6D672E6F72672F436F734E616D696E672F4E616D696E67436F6E746578744578743A312E300000000000020000000000000078000102000000000F36312E3134342E3235332E3131370000271000000000001F5374616E646172644E532F4E616D655365727665722D504F412F5F726F6F7400000000020000000000000008000000004A414300000000010000001C00000000000100010000000105010001000101090000000105010001000000010000002C0000000000000001000000010000001C00000000000100010000000105010001000101090000000105010001”;
//根据ior字符串获取对方命名服务
NamingContext nameService = (NamingContext)RemotingServices.Connect(typeof(NamingContext), ior);
//根据对象绑定的服务名获取远程对象
NameComponent[] name = new NameComponent[] { new NameComponent(“MZYL”, “Service”) };
string yljgbm = “H0920”;
string ylzh = “%***************************************”;
string pass = “”;
string zzyybm = “*“;
string czybm = “*“;
string czy = “*“;
short[] czyxm = transfromSA(czy);
hi.GRXX hr;
intMZ mz = (intMZ) nameService.resolve(name);
Console.WriteLine();
//测试方法
short[] res = mz.GetGRJBXX(yljgbm, ylzh, pass, czybm, czyxm, out hr);
Console.WriteLine(TransformAS(res));
Console.WriteLine(hr.ACCOUNT);
Console.WriteLine(hr.YLZH);
Console.WriteLine(hr.XB);
Console.WriteLine("finished!");
}
catch (Exception e)
{
Console.WriteLine("exception: " + e);
}
}
//string类型转为short[]
public static short[] transfromSA(string strArray)
{
short[] shortArray = new short[strArray.Length];
char[] chars = strArray.ToCharArray();
for (int i = 0; i < strArray.Length;i++ ) {
shortArray[i] = transCharToShort(chars[i]);
}
return shortArray;
}
public static short transCharToShort(char c) {
char[] t = new char[1];
t[0] = c;
string strTemp = new string(t);
byte[] cc = System.Text.Encoding.Default.GetBytes(strTemp);
if (cc.Length == 1)
{
return (short)(cc[0] < 0 ? cc[0] + 256 : cc[0]);
}
int v1 = cc[0] < 0 ? cc[0] + 256 : cc[0];
int v2 = cc[1] < 0 ? cc[1] + 256 : cc[1];
return (short)(v1 * 256 + v2);
}
//short[] 转为string类型
public static string TransformAS(short[] sArray)
{
char[] charArray = new char[sArray.Length];
for (int i = 0; i < sArray.Length; i++)
{
charArray[i] = TransShortToChar(sArray[i]);
}
return new String(charArray);
}
private static char TransShortToChar(short sTemp)
{
if (sTemp >= 0)
{
return (char)sTemp;
}
byte[] b = new byte[2];
b[0] = (byte)(sTemp >>;
b[1] = (byte)sTemp;
string strTemp = System.Text.Encoding.Default.GetString(b);
char[] charArrTemp = strTemp.ToCharArray();
return charArrTemp[0];
}
}
}
- 测试输出。
程序正常输出结构体GRXX中的信息,说明能与服务器端正常通讯,进行数据交换。如程序出现异常,一般表现为:
未能与服务器建立连接(如ior文件错误,或网络连接失败);
服务名填写错误(如门诊服务名为:”MZYL”,”Service”,一旦服务名填写错误,不能获取服务器端门诊服务对象。)
本地测试某些方法时,传入的参数为空;
服务器端某些方法的实现有问题。
五、 结束语
本文通过分析使用.NET应用IIOP.NET开发深圳医保接口的示例,阐释了使用C#开发corba应用程序的流程。通过采用IIOP.NET 能够达到企业级应用系统的无缝集成的要求,IIOP.NET 具有可靠性高,可用性强,紧耦合等特点,并且这个技术是一个开源项目,拥有 LGPL 许可证,因此,它是一种理想的企业级应用工具和应用系统解决方案。
- 顶
- 0
- 踩
CORBA简介的更多相关文章
- CORBA技术及实例
CORBA技术及实例 CORBA是一种规范,它定义了分布式对象如何实现互操作.在WorldWideWeb盛行之前,非凡是java编程语言风靡之前,C++开发者基本将CORBA作为其高端分布式对象的解决 ...
- 基于CORBA/WEB技术构建三层体系结构的应用
1 问题提出 在应用系统开发过程中,CLIENT/SERVER体系结构得到了广泛的应用 .其特点是,应用程序逻辑通常分布在客户和服务器两端,客户端发出数据资源访问请求,服务器端将结果返回客户端.但CL ...
- 那些年,我们追过的RPC
1974年冬,互联网大师 Jon Postel发表了RFC674:“Procedure Call Protocol Documents,Version 2”,尝试定义一种在包含70个节点的网络中共享资 ...
- Java学习资源 - J2EE
java Web开发基础(一)工程项目文档结构 ========rmi=========== Java RMI 框架(远程方法调用) java RMI原理详解 深究Java中的RMI底层原理 ==== ...
- IDL简介与corba入门案例
IDL接口定义语言简介 IDL用中立语言的方式进行描述,能使软件组建(不同语言编写的)间相互通信. IDL提供了一个桥来连接不同的系统. Corba 上的服务用IDL描述,将被映射为某种程序设计语 ...
- NetMQ(一):zeromq简介
ZeroMQ系列 之NetMQ 一:zeromq简介 二:NetMQ 请求响应模式 Request-Reply 三:NetMQ 发布订阅模式 Publisher-Subscriber 四:NetMQ ...
- Hibernate核心技术简介
Hibernate核心技术简介 1.Hibernate映射文件开发 Hibernate映射文件就是项目中*.hbm.xml文件,其主要是完成各元素的配置,包括根元素.类元素.定义主键.设置主键 ...
- J2EE基础之Web服务简介
J2EE基础之Web服务简介 1.什么是Web服务? 在人们的日常生活中,经常会查询网页上某城市的天气信息,这些信息都是动态的.实时的,它是专业的气象站提供的一种服务.例如,在网上购物时,通常采用网上 ...
- REST简介及设计原则
rest,即REST(Representational State Transfer表述性状态转移)是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性. 简介 REST (R ...
随机推荐
- python 拷贝 深拷贝 浅拷贝 赋值
t = [1,["a","b"]] t_bak = t t_cop = copy.copy(t) t_deep = copy.deepcopy(t) print ...
- django 认证系统--1
django的认证系统提供认证和授权两种功能 认证系统包括如下部分: 1.Users 2.Permissions 主要是以 YES/NO 的形式反映一个用户是否能够做某事 3.Groups:就是对多个 ...
- PowerDesigner 逆向工程
原文地址:https://www.cnblogs.com/feilong3540717/archive/2011/11/18/2254040.html PowserDesigner 的打开路径:Fil ...
- 编程四剑客sed-2019.2.20
sed [-Options] [‘Commands’] filename; sed工具默认处理文本,文本内容输出屏幕已经修改,但是文件内容其实没有修改,需要加-i参数即对文件彻底修 ...
- struts2漏洞信息
渗透篇01-struts2漏洞利用 https://blog.csdn.net/qq_38055050/article/details/79841604 Struts2著名RCE漏洞引发的十年之思 ...
- Vue sync修饰符的使用
父子组件传值,父组件可以给子组件传值,但是子组件是不能修改组件提供的值,这里vue提供了sync修饰符,以前父组件点击子组件显示,子组件关闭按钮,父组件再点击子组件就无法让子组件显示.因为子组件点击关 ...
- php原样输出被编译过的html(适用于一些保存编辑器的内容)
有时候有些编辑器写进数据库时尖括号或双引号被编译过,这时候输入来就是处理一下,不然得不到原样的 输入用 html_entity_decode($content)就可以了,有些直接存完整html的,输 ...
- Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag.
https://blog.csdn.net/watermusicyes/article/details/44963773 Context中有一个startActivity方法,Activity继承自C ...
- Java中递归的优缺点,Java写一个递归遍历目录下面的所有文件包括子文件夹里边的文件。
题目: 遍历出aaa文件夹下的文件 首先分析思路: 1.首先判断这个文件夹是否为文件,通过isFile()函数可以判断是否为文件. 2.然后通过isDirectory判断是否为目录. 3.如果是目录就 ...
- 无线LoRa智能远传水表
1.1 主流程 无线远传智能预付费水表是基于瑞萨R7F0C002芯片开发的一款水表,该款水表包含了电子计数.远程充值.远程开关阀.费控.欠费提醒等功能. 水表通信采用LoRa无线模式,芯片采用SX12 ...