我正在将旧的VBSCript WSC组件重写为更好的C#COM组件。
出于可怕的原因,一个地方的旧组件通过使用
传递服务器上下文,IServerSet 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
。
有没有人知道这样做的方法/解决方法?按照这个速度,我想我可能不得不改变组件的行为
答案 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的引用。