2009-05-26 7 views
4

Je réécris un ancien composant VSCSCript WSC en un composant C# COM plus agréable.Server.MapPath dans un composant COM

Pour une raison horrible l'ancien composant dans un seul endroit est passé le contexte du serveur, IServer en utilisant

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

c'est ensuite utilisé pour faire une norme Server.MapPath("/somelocation")

Cependant, je suis perplexe sur ce à faire dans le composant COM .Net, System.Web.HttpContext.Current.MapPath() ne fonctionne pas comme prévu car il n'y a pas de contexte Web.

J'ai essayé de passer le contexte de ASP classique dans le composant COM, mais je ne suis pas sûr de la référence à inclure afin que je puisse invoquer le membre correct, Microsoft.Active X Data Objects 2.7 semble commun, mais cela inclut seulement Recordsets etc, rien pour l'interface C++ IServer donc il vient juste comme COM OBJECT.

Est-ce que quelqu'un connaît un moyen de le faire? À ce rythme, je pense que je devrais peut-être changer le comportement du composant

Répondre

9

Ajouter à votre projet C# un Interop pour ASP.dll (vous le trouverez dans le répertoire \ system32 \ inetsrv

Ajouter une méthode publique à la classe qui obtient instancié par ASP: -.

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

maintenant, quand vous avez besoin d'une utilisation MapPath: -.

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

contexte Remarque vous donne accès à la demande, la réponse et la session en plus de serveur le OnStartPage est un pré-COM + hack qui ASP utilisé et fonctionne même dans les dernières versions. ASP exécute l'équivalent COM de la réflexion (en examinant les informations de la bibliothèque de types de classes COM) pour déterminer si une méthode OnStartPage publique est disponible. Dans ce cas, elle l'appelle en transmettant l'objet ScriptingContext.

Il n'y a pas de .NET HttpContext disponible, la requête aurait dû être traitée par .NET en premier lieu pour que cela existe. Un HttpContext ne peut pas être créé sur un thread "après le fait" pour ainsi dire. Par conséquent, si votre composant doit interagir avec la conversation Http, il devra le faire via l'objet de contexte ASP puisque ASP est l'hôte qui gère réellement la requête.

+0

L'homme si cela fonctionne alors il génie! Bonne profondeur de connaissance Anthony, chapeaux à vous. –

0

Pourquoi ne pas passer le chemin complet vers "/ somelocation" à votre composant C# COM? Cela vous aidera à vous débarrasser de certaines dépendances laides.


MISE À JOUR: Vous souhaiterez peut-être essayer HostingEnvironment.MapPath. Vous devez ajouter une référence à System.Web avant de l'utiliser.

+0

c'est ce que je voulais faire, en fait je fais pour le chemin vers un fichier xml qu'il utilise pour démarrer mais il trouve ensuite un chemin virtuel dans ce fichier XML qu'il doit ensuite mapper dans le composant, je sais qu'il est sale mais pour le moment je suis lié à seulement changer ce composant – MJJames

+0

Avez-vous essayé HostingEnvironment.MapPath? –

+0

Malheureusement HostingEnvironment.MapPath ne fonctionne pas – MJJames

2

Je pense en effet changer le comportement est la meilleure option ici ... wel ... pas exactement le comportement, mais l'interface de l'objet COM ... Au lieu de passer dans le contexte du serveur, il suffit de passer dans le pertinent informations nécessaires pour la méthode.

+0

Ceci est probablement la meilleure option, suivant la loi de Demeter - http://en.wikipedia.org/wiki/Law_of_Demeter – Nate

Questions connexes