COM组件中的Server.MapPath

时间:2009-05-26 15:21:30

标签: 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接口没有任何内容,所以它只是COM OBJECT

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

3 个答案:

答案 0 :(得分:9)

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

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

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

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

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

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

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

答案 1 :(得分:2)

我认为确实改变行为是这里最好的选择......好吧......不完全是行为,而是COM对象的接口......而不是传入服务器上下文,只需传递相关信息该方法需要。

答案 2 :(得分:0)

为什么不将“/ somelocation”的完整路径传递给C#COM组件?这将帮助你摆脱一些丑陋的依赖。


更新:您可能想尝试HostingEnvironment.MapPath。在使用之前,您需要添加对System.Web的引用。