【问题标题】:Server.MapPath in a COM ComponentCOM 组件中的 Server.MapPath
【发布时间】:2010-10-29 00:24:50
【问题描述】:

我正在将旧的 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 上下文。

我尝试将上下文从 Classic ASP 传递到 COM 组件,但我不确定要包含哪个引用,因此我可以调用正确的成员,Microsoft.Active X Data Objects 2.7 似乎很常见,但这仅包括 Recordsets等等,C++ IServer 接口没有什么,所以它就像COM OBJECT 一样。

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

【问题讨论】:

    标签: c# com asp-classic vbscript


    【解决方案1】:

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


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

    【讨论】:

    • 这就是我想要做的,事实上我是为它用来启动的 xml 文件的路径做的,但是它会在这个 XML 文件中找到一个虚拟路径,然后它需要在组件,我知道它很脏,但目前我只能更改此组件
    • 您尝试过 HostingEnvironment.MapPath 吗?
    【解决方案2】:

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

    【讨论】:

    【解决方案3】:

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

    向由 ASP 实例化的类添加公共方法:-

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

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

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

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

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

    【讨论】:

    • 男人,如果那行得通,那就是天才!安东尼知识渊博,向你致敬。
    猜你喜欢
    • 2010-09-21
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 2011-02-11
    • 2012-08-14
    • 1970-01-01
    相关资源
    最近更新 更多