求助:WebSpere VS IE 时IE中运行.NET的Windows控件出现的问题
最近小弟搞一个工程,B/S的,比较的麻烦,需要将.net和j2ee联合使用
服务器是j2ee,使用什么阿法奇或汤姆猫之类的基于java的发布器,没有IIS ,
客户端为一个在IE中运行的一个使用c#编写的WindowsForm控件
网页内嵌一个控件自然又牵涉到控件的下载和自动更新
首先在要运行的机器上装了.NET框架1.1,进入,然后进入
[控制面板]-[管理工具]-[Microsoft .NET Framework 1.1 Configuration]
然后进入[我的电脑]-[运行库安全策略]-[计算机]-[代码组]-[All_Code]进入它的属性对话框
中,把它的[权限集]设为[FullTrus]
本来参考相关材料显示该控件的HTML页面代码为
<html>
<head>
<title>电子病历编辑器演示</title>
</head>
<body>
<object id="mycontrol" width="100%" height="90%" classid="DocumentLib.dll#TextDocumentLib.EditPanel"
VIEWASTEXT>
</object>
<input type="button" value="初始化" onclick="init()" />
</body>
</html>
但将 documentlib.dll 拷贝到运行j2ee的服务器上,该页面不能正确显示,后觉得可能发布器有什么问题
于是自己编了个端口监听程序,分析出了差别,原来在于HTTP返回的contenttype有差别,
至于为什么有这个差别我就没深究了,我在服务器上加了一个JSP,文件名为 dll.jsp,代码如下
---------------------------------------------------------------------------------------------------
<%@ page contentType="text/html; charset=GBK" %><%
try
{
com.haitai.emr.common.Debug.println("DLL.jsp");
response.setContentType("application/octet-stream"); //设置返回的文件类型
FileInputStream hFile = new FileInputStream(pageContext.getServletContext().getRealPath("/") + "\DocumentLib.DLL"); // 以byte流的方式打开文件
System.out.println(pageContext.getServletContext().getRealPath("/") + "\emrtext\EMRTextDocumentLib.DLL");
int i = hFile.available(); //得到文件大小
byte data[] = new byte[i];
hFile.read(data); //读数据
hFile.close();
ServletOutputStream toClient = response.getOutputStream(); //得到向客户端输出二进制数据的对象
toClient.write(data); //输出数据
toClient.flush();
toClient.close();
}
catch(IllegalStateException e){
e.printStackTrace();
}
catch(Throwable ext){
ext.printStackTrace();
}
%><%@ page import="java.lang.*" %><%@ page import="java.util.*" %><%@ page import="java.io.*" %>
-----------------------------------------------------------------------------------------------------
HTML代码变成了
<html>
<head>
<title>电子病历编辑器演示</title>
</head>
<body>
<object id="mycontrol" width="100%" height="90%" classid="dll.jsp#TextDocumentLib.EditPanel"
VIEWASTEXT>
</object>
<input type="button" value="初始化" onclick="init()" />
</body>
</html>
结果页面能正确显示了
现在出现的问题是这个页面打开时老是连接dll.jsp,估计是检查最新版本吧.我根据一些资料猜测可以在页面引用
应用程序配置文件来避免这个重复的操作.服务器上可以放置一个合适的 webconfig.xml ,HTML页面改成如下
<html>
<head>
<title>电子病历编辑器演示</title>
<link rel="Configuration" href="webconfig.xml" />
</head>
<body>
<object id="mycontrol" width="100%" height="90%" classid="dll.jsp#TextDocumentLib.EditPanel"
VIEWASTEXT>
</object>
<input type="button" value="初始化" onclick="init()" />
</body>
</html>
可是我不知道如何编写这个webconfig.xml,我用 sn.exe makecert.exe signcode.exe 对那个控件搞了个强名称
,处理后的dll文件可以扔进Windows2000的assembly高速缓冲中,然后尝试的写了个如下的webconfig.xml ,可以好像没有用
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="DocumentLib" publicKeyToken="4b96b5c6ae565d61" Culture="neutral" />
<bindingRedirect newVersion="1.0.1803.26449" />
<codeBase version="1.0.1803.26449" href="DocumentLib.dll" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
还有一个问题,在某些机器中,控件加载缓慢,仔细研究,发现程序在"System.Resources.ResourceManager.GetObject()"
中停留了很长时间,我还有一次定位到了"System.ConfigTreeParser.Parse(string , string , boolean )"上,
不知道是什么地域设置还是权限有什么问题或者其他原因.
问题总结:
1.如何对IE中运行的.netWindows控件进行自动下载和更新,最好靠个 <link rel="Configuration" href="webconfig.xml" />
避免无意义的下载dll文件
2.能不能不使用上面的 dll.jsp 而直接定向到 dll文件本身
3.如何解决在某些机器中控件加载缓慢问题
4.上面的发布器对文件名大小写敏感, DocumentLib.dll 和 DocumentLib.DLL是不同的, vs.net编译生成 dll ,而IE却老是
视图下载 DLL,害的我拷贝到服务器上时要改dll为DLL , 不知能不能少这点麻烦.