需求一开始是在页面中嵌入用c#写的rldc编辑器,参照传统activex思路,还看了微软一站式编程中的例子,均告失败。
后经反复研究。找出了问题所在,成功把编辑器弄进了web页面。在ie6,7,8中均通过。客服端安装activex相应的framework。
其实通过这种方法,在web中, 可以任意使用.net写的dll.
主要问题
1, IE 加载DLL(英文关键字,ie host)
由于IE安全限制,可能导致客服端不能从服务器端把dll下载,并加载进IE。
解决方法,把站点加入信任站点。
2,DLL本地运行安全限制
托管dll并没有在本地注册,所以可能会遇到权限不够,而不能运行的问题。
解决方法,一个是不管那么多,修改.net framework的信任级别。
二强名称签名,然后根据签名设置权限。
三根据dll所在目录路径设置权限
本文所用方法是第一种,修改.net framework的信任级别。
若是要研究第二和第三种方法请Google : caspol -chggroup 1.5 FullTrust
还有这些链接可能对你有帮助
http://thebackroomtech.com/2009/04/01/using-caspolexe-to-grant-net-applications-rights-to-a-remote-network-share/
http://support.microsoft.com/kb/313892/en-us
应用举例
步骤:
一,应用页面配置:
1,嵌入页面
<div id="designContainer" runat="server" style="display: none; 100%; height: 100%">
<object id="reportDesigner" name="reportDesigner" classid="http:ReportDesign.dll#fyiReporting.ReportDesign.ReportDesignCtrl"
width="100%" height="100%">
<param name="UserNo" id="UserNo" value="<%=UserNo%>" />
<param name="WebServiceURL" id="WebServiceURL" value="<%=xriskHost%>/WebService/ReportWebService.asmx" />
</object>
</div>
2,检测用户是否已安装.net framework。
$(document).ready(function() {
if (navigator.userAgent.indexOf(".NET CLR") > -1) {
} else {
alert("因客户端未安装.net运行时");
}
});
//试图从js调用dll,注意有个延时,以防第一次加载需要时间比较长。
function getObj() {
var obj = $("#reportDesigner").get(0);
tryCount += 1;
if (obj && obj.LoadFlag == "1") {
$("#designContainer").show();
loadingPanel.Hide();
if (reportCode) {
obj.EditReport(reportCode, reportName);
} else {
obj.CreateReport();
}
} else {
if (tryCount < 10) {
window.setTimeout("getObj()", interval);
} else {
alert("加载报告设计器失败!请下载执行初始脚本!");
$("#designContainer").hide();
$("#downloadContainer").show();
loadingPanel.Hide();
}
}
}
二,下载dat处理文件并执行
文件内容,注意//后面是我加的注释,具体运行时需要去掉,里面的ip地址可以替换成自己的站点地址
@ECHO OFF
add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Ranges\Range1000"
reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Ranges\Range1000" /v http /t REG_DWORD /d 0x00000002 /f
//添加信任站点
reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Ranges\Range1000" /v :Range /t REG_SZ /d 191.168.0.54 /f
//允许该站点弹出窗口
reg add "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\New Windows\Allow" /v 191.168.0.54 /t REG_SZ /d 0 /f
//设置信任级别
cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
caspol -chggroup 1.5 FullTrust
//第一次访问站点,关掉当前窗口,并重新打开窗口
taskkill /f /im iexplore.exe
start iexplore http://191.168.0.54:80/xx/login.aspx
三,让dat脚本能被客服端浏览器访问还要做些手脚
1,IIS-文件夹-属性-http头-MIME类型添加:batapplication/batch
2,访问bat文件所在目录,将文件安全性中加入IE匿名访问帐户。这个账户即是iis中那个匿名账户,或者说是asp.net运行时的模拟账户。
PS:
从bat脚本来看,很明显这段代码是可以通过递送web地址来拼凑的,目前我们是在登录页面里,解析出站点url,
然后写一份bat到服务器,在登录页面给出固定链接,这样部署起来,工程人员不用随站点地址变化而修改bat文件。