COM组件中的Server.MapPath

MJJ*_*mes 4 c# com vbscript asp-classic

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

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

Set objCurr = CreateObject("MTxAS.AppServer.1")
Set objCurrObjCont = objCurr.GetObjectContext()
Set component.servercontext = objCurrObjCont("Server")
Run Code Online (Sandbox Code Playgroud)

这用于做标准 Server.MapPath("/somelocation")

但是,我对.Net COM组件中的操作感到困惑,System.Web.HttpContext.Current.MapPath()因为没有Web上下文而无法正常工作.

我尝试将经典ASP中的上下文传递给COM组件,但我不确定包含哪个引用,所以我可以调用正确的成员,Microsoft.Active X Data Objects 2.7似乎很常见,但这只包括Recordsets等,没什么对于C++ IServer接口,它就像我们一样COM OBJECT.

有谁知道这样做的方法/解决方法?按照这个速度,我想我可能不得不改变组件的行为

Ant*_*nes 9

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

将一个公共方法添加到由ASP实例化的类中: -

 ASPTypeLibrary.ScriptingContext context;
 public void OnStartPage(ASPTypeLibrary.ScriptingContext sc)
 {
     context = sc;
 }
Run Code Online (Sandbox Code Playgroud)

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

 context.Server.MapPath("...");
Run Code Online (Sandbox Code Playgroud)

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

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