我们一直在使用SAP"COM许可证桥"来访问其许可证服务器并以编程方式查询系统的硬件密钥(以重用自己的许可证).这在SAP Business One版本2007A,2007B和8.8上运行良好,但是在8.81中它们似乎更新了它们的CORBA接口而没有更新COM包装器,因为我们现在在尝试调用GetHardwareKey函数时获得了内存异常.
所以我下载了IIOP.NET并开始尝试编写自己的界面.无论如何我从来都不喜欢COM包装器.但我遇到了我的旧远程.NET远程控制 - 无法在服务器和客户端都没有定义公共接口的情况下调用远程方法.我尝试使用IIOP.NET附带的IDL到CLS编译器,但我继续得到关于接口beign不兼容的错误(SAP没有提供IDL文件).我不知道IIOP和CORBA如何确定接口是否兼容.但我甚至尝试调试IIOP.NET代码并强制它执行该方法,尽管不兼容,但收到一个空字符串而不是我想要的硬件密钥.
我的下一步是尝试实现虚假的许可证服务器并检查来自生产客户端的请求,以期确定它们应该是什么样子,但考虑到我遇到的困难,我并不指望取得多大的成功.深入了解.NET远程的内容.
我真正的问题是如何获取或生成SAP Business One硬件密钥,但由此产生的问题包括:
编辑:我设法通过应用RepositoryID属性使IIOP.NET/CORBA相信我有一个兼容的接口:
[Ch.Elca.Iiop.Idl.InterfaceType(Ch.Elca.Iiop.Idl.IdlTypeInterface.ConcreteInterface)]
[Ch.Elca.Iiop.Idl.RepositoryID("IDL:LicenseInfo:1.0")]
public interface ILicenseInfo : Ch.Elca.Iiop.Idl.IIdlEntity
{
void GetHardwareKey(out string hwKey);
}
Run Code Online (Sandbox Code Playgroud)
但我仍然得到一个空字符串结果.
编辑2:经过一些实验和调试之后,我发现响应消息确实包含了我正在寻找的数据,但是没有正确地解析成客户端值,可能是因为我的接口定义不好.希望进一步调试响应处理将帮助我弄清楚如何纠正我的界面.奇怪的是,它从响应中解析的第一件事是一个空的盒装值,这似乎不适合"out string"参数.
编辑3:我发现我需要将字符串属性应用于这样的参数,以防止它们被视为盒装值:
void GetHardwareKey([StringValue(), WideChar(true)] out string hwKey);
Run Code Online (Sandbox Code Playgroud)
但是,尽管有WideChar属性,我对CodeSet不支持WChar或其他东西的错误.我已经非常接近搞清楚了.
编辑4:我对如何为WChar设置代码集感到困惑.如果我没有设置它,我收到一个错误:"未指定或不支持WChar代码集." 因为服务器返回了一个unicode字符串而没有覆盖默认字符集.我找不到任何方法来覆盖客户端.我试着打电话:
omg.org.CORBA.OrbServices.GetSingleton().OverrideDefaultCharSets(
CharSet.UTF8, WCharSet.UTF16);
Run Code Online (Sandbox Code Playgroud)
但这似乎对客户端没有任何影响.示例代码显示在服务器端调用它.但我没有写服务器,所以我无法控制它.我唯一的选择是为了我自己的目的重写IIOP.NET代码,强制默认的WChar CodeSet生效?
我试图追踪玻璃鱼中污染我们的日志文件的恼人消息的原因.
为了简化我们的设置,我们有2个运行3.1.2.2的glassfish服务器.
服务器A在其上部署了Web服务,使用基于证书的安全性,该安全性使用Web服务中的角色以及sun-ejb-jar.xml和sun-application.xml中的映射进行定义.
服务器B上部署了远程EJB,未配置任何安全性.
在服务器B上调用远程EJB时,使用以下代码从服务器A上的Web服务:
Properties props = new Properties();
props.setProperty("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory");
props.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");
props.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
props.setProperty("org.omg.CORBA.ORBInitialHost", server.getServer());
props.setProperty("org.omg.CORBA.ORBInitialPort", Integer.toString(server.getEjb3Port()));
InitialContext ic = new InitialContext(props);
return ((MyIF)ic.lookup(MyIF.class.getName())).doWork();
Run Code Online (Sandbox Code Playgroud)
登录服务器A会记录以下内容,但EJB调用按预期工作.
[#|2012-09-20T08:43:42.141+0100|SEVERE|glassfish3.1.2|javax.enterprise.system.core.security.com.sun.enterprise.iiop.security|_ThreadID=26;_ThreadName=Thread-2;|IIOP1002: Principal propagation: Cannot find principal information in subject|#]
Run Code Online (Sandbox Code Playgroud)
有没有人有这个错误的经验,知道如何解决这个问题?
在Oracle文档上的信息是不是非常有帮助.
IIOP1002主要传播:无法在主题中找到主要信息
原因:主题中未找到主要信息
操作:请检查身份传播的配置设置
据我所知,在EJB 2.x中,客户端使用home接口请求对组件接口的引用,并使用该引用调用Enterprise java bean的业务方法.但是存根和骨架的概念对我来说并不清楚.
对组件接口的引用是否充当存根?然后哪一个充当骨架?
请澄清.
我有一些Java代码使用Java Domino API(使用NCSO.jar)通过IIOP连接Domino数据库.现在的一个新要求是,如果要连接的服务器是群集的,则应该可以利用此功能,并在当前连接的服务器发生故障时切换到群集中的故障转移服务器.
不幸的是,Domino Java API是彻头彻尾的晦涩,在本地和远程使用API而不是IIOP之间存在细微差别,很少有非常明确的解释和奇怪的差异取决于您提供方法的参数.
我设法从这里收集了一些信息...... openWithFailoverMethod是否有效?
我还检查了IBM信息中心的文档.
我试过的第一件事就是:
Session session = NotesFactory.createSession(host + ":" + port, user, password);
Database db = session.getDatabase(null, databaseName, false);
db.openWithFailover(host, databaseName);
Run Code Online (Sandbox Code Playgroud)
getDatabase对于IIOP操作,服务器名称的第一个参数显然必须为null.openWithFailover当它已经在会话中时,如何在方法中再次指定服务器名称时我感到很神秘,但我想你可以通过会话连接到集群,然后在open方法中指定主服务器.但是,为什么需要两次提供数据库名称并不十分清楚.如果无法访问数据库,那么最后一个参数表明不应该创建数据库(省略它并且它默认为true;多么美妙).
不幸的是,这NotesException: This database object is already open as E:\Lotus\Domino\data\mail-in\EDITEST.nsf在我脸上吐了一个例外.它出现在该openWithFailover方法的行上.
显然,第一次调用getDatabase已打开它,并且没有关闭方法或选项只能在不实际打开它的情况下获取对象.所述Database类是一个接口,所以没有静态方法来获取这样的对象或以其他方式将其实例化的一种方式.我查了一下,我找到的唯一选择是openDatabase在课堂上使用DbDirectory.猜猜那是做什么的.现在该方法确实有一个带有布尔值的替代方法,表明您是否希望使用故障转移,但根据文档,对于IIOP操作,它总是错误的.
根据此页面,您可以Database通过getDatabase使用两个空参数调用来获取空对象.所以我尝试了这个:
Session session = NotesFactory.createSession(host + ":" + port, user, password);
Database db = session.getDatabase(null, null, false);
db.openWithFailOver(host, …Run Code Online (Sandbox Code Playgroud) iiop ×4
java ×2
java-ee ×2
.net ×1
c# ×1
corba ×1
ejb ×1
ejb-2.x ×1
glassfish ×1
glassfish-3 ×1
lotus-domino ×1
lotus-notes ×1
remoting ×1
rmi ×1