在COM组件中的Server.MapPath

4

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

由于某种可怕的原因,旧组件在某个地方使用IServer通过传递Server Context来运行。

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

这样就可以使用标准的Server.MapPath("/somelocation")

然而,在 .Net COM 组件中,我不知道该怎么做,因为没有 Web 上下文,所以 System.Web.HttpContext.Current.MapPath() 无法按预期工作。

我尝试将 Classic ASP 中的上下文传递到 COM 组件中,但我不确定要包含哪个引用才能调用正确的成员。Microsoft.ActiveXDataObjects2.7 似乎是一个常见的引用,但它只包括 Recordsets 等内容,没有 C++ IServer 接口,因此只会显示为 COM OBJECT

有人知道如何解决这个问题吗?如果继续这样做,我觉得可能需要改变组件的行为。

3个回答

9
在您的C#项目中添加与ASP.dll的互操作性(您将在\system32\inetsrv文件夹中找到它)。
为由ASP实例化的类添加一个公共方法:-
 ASPTypeLibrary.ScriptingContext context;
 public void OnStartPage(ASPTypeLibrary.ScriptingContext sc)
 {
     context = sc;
 }

现在当你需要使用MapPath时,请使用以下代码:
 context.Server.MapPath("...");

注意上下文使您可以访问Request、Response和Session,以及Server。OnStartPage是ASP使用的一种预COM+技术,即使在最新版本中仍然有效。ASP执行COM等效于反射(检查COM类类型库信息)以确定是否可用公共OnStartPage方法,如果是,则调用它并传递ScriptingContext对象。

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


哇,如果那真的可行,那太厉害了!安东尼,你的知识水平真的很深,向你致敬。 - Pete Duncanson

2

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


这可能是最好的选择,遵循迪米特法则 - http://en.wikipedia.org/wiki/Law_of_Demeter - Nate

0
为什么不将完整路径传递给你的C# COM组件,以便于消除一些丑陋的依赖关系呢?


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


这正是我想要做的事情,实际上我为启动所使用的XML文件路径已经做到了,但它随后在该XML文件中找到一个虚拟路径,需要在组件内进行映射。我知道这很不规范,但目前我只能更改此组件。 - MJJames
你尝试过使用HostingEnvironment.MapPath吗? - Jakob Christensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接