求助: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 , 不知能不能少這點麻煩.