2009-05-26 6 views
4

Я переписываю старый компонент WSCWript WSC в более приятный Компонент C# COM.Server.MapPath в 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() не работает должным образом, так как нет веб-контекста.

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

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

ответ

9

Добавить в свой проект C# в Interop для 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 является хостом, который фактически обрабатывает запрос.

+0

Человек, если эта работа тогда гениальна! Хорошая глубина знаний Энтони, шляпы к тебе. –

0

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


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

+0

Это то, что я хотел сделать, infact я делаю для пути к XML-файлу, который он использует для запуска, однако затем находит виртуальный путь в этом XML-файле, который ему необходимо отобразить в компоненте, я знаю, что это грязный, но на данный момент я привязан только к изменению этого компонента. – MJJames

+0

Вы пробовали HostingEnvironment.MapPath? –

+0

К сожалению, HostingEnvironment.MapPath не работает – MJJames

2

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

+0

Это, пожалуй, лучший вариант, следуя Закону Деметры - http://en.wikipedia.org/wiki/Law_of_Demeter – Nate

Смежные вопросы