Server.MapPath в COM-компоненте - PullRequest
4 голосов
/ 26 мая 2009

Я переписываю старый компонент VBSCript WSC в более удобный компонент C # COM.

По ужасной причине старому компоненту в одном месте передается контекст сервера, IServer с использованием

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

затем используется для стандартного Server.MapPath("/somelocation")

Однако я не могу понять, что делать в COM-компоненте .Net, System.Web.HttpContext.Current.MapPath() не работает должным образом, так как отсутствует веб-контекст.

Я попытался передать контекст из классического ASP в COM-компонент, но я не уверен, какую ссылку включить, чтобы я мог вызвать правильный член, Microsoft.Active X Data Objects 2.7 кажется распространенным, но он включает только наборы записей и так далее, ничего для интерфейса C ++ IServer, поэтому он выглядит как COM OBJECT.

Кто-нибудь знает способ сделать это / обходной путь? С такой скоростью я думаю, что мне, возможно, придется изменить поведение компонента

Ответы [ 3 ]

9 голосов
/ 28 мая 2009

Добавьте в свой проект C # взаимодействие для ASP.dll (вы найдете его в папке \ system32 \ inetsrv.

Добавить открытый метод в класс, экземпляр которого создается ASP: -

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

Теперь, когда вам нужен MapPath, используйте: -

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

Примечание контекст дает вам доступ к запросу, ответу и сеансу в дополнение к серверу. OnStartPage - это взлом до COM +, который использует ASP и до сих пор работает даже в последних версиях. ASP выполняет COM-эквивалент отражения (исследуя информацию о библиотеке типов классов COM), чтобы определить, доступен ли общедоступный метод OnStartPage, и в этом случае он вызывает его, передав объект ScriptingContext.

Нет доступного .NET HttpContext, запрос должен был бы быть обработан .NET в первую очередь для того, чтобы он существовал. HttpContext не может быть создан в потоке "после факта", как это было. Следовательно, если ваш компонент должен взаимодействовать с Http-диалогом, он должен будет сделать это через объект контекста ASP, поскольку ASP является хостом, который фактически обрабатывает запрос.

2 голосов
/ 26 мая 2009

Я думаю, действительно, изменение поведения - лучший вариант здесь ... ну ... не совсем поведение, а интерфейс COM-объекта ... Вместо передачи в контексте сервера, просто передайте соответствующую информацию необходимо для метода.

0 голосов
/ 26 мая 2009

Почему бы не передать полный путь к "/ somelocation" вашему компоненту C # COM? Это поможет вам избавиться от некоторых уродливых зависимостей.


ОБНОВЛЕНИЕ: Вы можете попробовать HostingEnvironment.MapPath . Вам необходимо добавить ссылку на System.Web перед ее использованием.

...