2009-05-26 7 views
4

Ich überschreibe eine alte VBSCript WSC-Komponente in eine nettere C# COM-Komponente.Server.MapPath in einer COM-Komponente

Für einen schrecklichen Grund die alte Komponente an einem Ort wird, um den Server-Kontext übergeben, IServer von

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

diese verwendet, wird dann eine Standard Server.MapPath("/somelocation")

zu tun, verwendet aber ich auf das, was ratlos bin in der .Net-COM-Komponente zu tun, funktioniert System.Web.HttpContext.Current.MapPath() nicht wie erwartet, da es keinen Web-Kontext gibt.

Ich habe versucht, den Kontext von Classic ASP in die COM-Komponente, aber ich bin nicht sicher, welche Referenz enthalten, damit ich das richtige Mitglied aufrufen kann, Microsoft.Active X Data Objects 2.7 scheint eine gemeinsame, aber das schließt nur Recordsets etc, nichts für die C++ IServer-Schnittstelle, so kommt es unser nur als COM OBJECT.

Kennt jemand eine Möglichkeit, dies/eine Arbeit zu tun? Bei dieser Rate denke ich, dass ich das Verhalten der Komponente ändern muss

Antwort

9

zu Ihrem C# Projekt hinzufügen eine Interop für ASP.dll (Sie es in das finden \ system32 \ inetsrv Ordner

eine öffentliche Methode zur Klasse hinzufügen, die von ASP instanziiert wird: -.

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

, wenn Sie eine MapPath Verwendung: -.

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

Hinweis Kontext gibt Ihnen auf die Anforderung Zugriff auf Antwort und Session zusätzlich zu Server der OnStartPage ist ein Pre-COM + Hack, ASP verwendet und funktioniert immer noch in den neuesten Versionen. ASP führt das COM-Äquivalent der Reflektion aus (untersucht die Bibliotheksinfo der COM-Klassen), um festzustellen, ob eine öffentliche OnStartPage-Methode verfügbar ist. Wenn dies der Fall ist, wird das ScriptingContext-Objekt übergeben.

Es gibt keinen .NET HttpContext verfügbar, die Anforderung hätte von .NET an erster Stelle behandelt werden müssen, damit diese existiert. Ein HttpContext kann nicht in einem Thread "nach der Tat" sozusagen erstellt werden. Wenn Ihre Komponente mit der HTTP-Konversation interagieren muss, muss dies daher über das ASP-Kontextobjekt geschehen, da ASP der Host ist, der die Anfrage tatsächlich bearbeitet.

+0

Man, wenn das funktioniert, dann ist es genial! Gute Tiefe des Wissens Anthony, Hut ab vor dir. –

0

Warum nicht den vollständigen Pfad zu "/ somelocation" an Ihre C# COM-Komponente übergeben? Dies wird Ihnen helfen, einige hässliche Abhängigkeiten loszuwerden.


UPDATE: Möglicherweise möchten Sie HostingEnvironment.MapPath versuchen. Sie müssen einen Verweis auf System.Web hinzufügen, bevor Sie es verwenden.

+0

Dies ist, was ich tun wollte, infact ich für den Pfad zu einer XML-Datei verwendet es zu starten, aber es findet dann einen virtuellen Pfad in dieser XML-Datei, die es dann innerhalb der Komponente zuordnen muss, ich weiß es ist schmutzig, aber im Moment bin ich nur diese Komponente zu ändern gebunden – MJJames

+0

Haben Sie versucht HostingEnvironment.MapPath? –

+0

Leider HostingEnvironment.MapPath funktioniert nicht – MJJames

2

Ich denke in der Tat die Änderung des Verhaltens ist die beste Option hier ... wel ... nicht genau das Verhalten, aber die Schnittstelle des COM-Objekts ... Statt in den Server-Kontext übergeben, geben Sie einfach die relevanten Informationen, die für die Methode benötigt werden.

+0

Dies ist wahrscheinlich die beste Option, nach dem Gesetz von Demeter - http://en.wikipedia.org/wiki/Law_of_Demeter – Nate

Verwandte Themen