c# - COM 组件中的 Server.MapPath

标签 c# com asp-classic vbscript

我正在将旧的 VBScript WSC 组件重写为更好的 C# COM 组件。

由于一个可怕的原因,一个地方的旧组件通过使用传递给服务器上下文,IServer

Set objCurr = CreateObject("MTxAS.AppServer.1")
Set objCurrObjCont = objCurr.GetObjectContext()
Set component.servercontext = objCurrObjCont("Server")

然后使用它来执行标准的 Server.MapPath("/somelocation")

但是我对在 .Net COM 组件中做什么感到困惑,System.Web.HttpContext.Current.MapPath() 没有按预期工作,因为没有 Web 上下文。

我尝试将上下文从经典 ASP 传递到 COM 组件,但我不确定要包含哪个引用以便我可以调用正确的成员,Microsoft.Active X Data Objects 2.7 似乎很常见,但这只包括 Recordsets等等,对于 C++ IServer 接口(interface)没有任何意义,所以它作为 COM OBJECT 出现。

有谁知道执行此操作/解决方法的方法吗?按照这个速度,我想我可能必须改变组件的行为

最佳答案

将 ASP.dll 互操作添加到您的 C# 项目(您将在\system32\inetsrv 文件夹中找到它。

将公共(public)方法添加到由 ASP 实例化的类中:-

 ASPTypeLibrary.ScriptingContext context;
 public void OnStartPage(ASPTypeLibrary.ScriptingContext sc)
 {
     context = sc;
 }

现在,当您需要 MapPath 时,请使用:-

 context.Server.MapPath("...");

除了服务器之外,注释上下文还可以让您访问请求、响应和 session 。 OnStartPage 是 ASP 使用的 COM+ 之前的 hack,即使在最新版本中也仍然有效。 ASP 执行 COM 等效反射(检查 COM 类类型库信息)以确定公共(public) OnStartPage 方法是否可用,如果可用,则调用它并传递 ScriptingContext 对象。

没有可用的 .NET HttpContext,请求必须首先由 .NET 处理才能存在。 HttpContext 不能按原样“事后”在线程上创建。因此,如果您的组件需要与 Http 对话进行交互,则必须通过 ASP 上下文对象进行交互,因为 ASP 是实际处理请求的主机。

关于c# - COM 组件中的 Server.MapPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/911271/

相关文章:

com - DllRegisterServer的使用

security - 清理经典ASP中输入的好方法

C# 十进制转 SQL Server Money

.net - 如何配置 COM 版本以使用由 RegAsm.exe 注册的 .NET 程序集?

c# - 将 BSTR 从 native c++ 传递到托管 c# dll 时出现问题

javascript - 谷歌地图自动缩放

iis-7 - IIS 7错误500 asp中的内部服务器错误

c# - DateTime.ToString 问题

c# - 使用 AppDomains 并行化非线程安全 DLL

c# - Windows 正在从我在一台机器上的日期中删除斜杠