ASP 0131 Unzulaessiger Pfad zum uebergeordneten Verzeichnis

Bei dem Versuch eine alte ASP (classic asp) Anwendung auf einem Windows 2008 R2 System und damit auf einem IIS 7.5 funktionsfähig zu bekommen bestand das Problem das die Seite immer nur einen HTTP Errorcode 500 zurück gibt. Einen Blick in die Logs von IIS ergab die Fehlermeldung:"|23|ASP_0131|Unzulässiger_Pfad_zum_übergeordneten_Verzeichnis"Ursache dieses Problems ist das Standardmäßig der übergeordneten ASP-Pfade für eine Website oder Anwendung bei gleichzeitiger Verwendung relativer übergeordneter Pfade in einer Include-Anweisung nicht erlaubt / deaktiviert ist. Empfohl ist die Einbindungen von <!--#include file="../dbconn.inc"-->auf<!--#include virtual="/<virtual path>/dbconn.inc"-->zu verändern. Alternativ kann man aber auch den Internet Information Server so einstellen, dass die übergeordneten ASP-Pfade erlaubt sind.Dafür muss man beim IIS auf das entsprechende Web klicken und in der rechten Seite unter ASP die Konfiguration öffnen. Dort gibt es dann die Option "Übergeordnete Pfade aktivieren" der Wert muss von False auf True umgestellt werden.

WCF REST Could not load file or assembly 'System.ServiceModel.Activation'

Bei dem Versuch HTTP Basic Auth für einen REST Dienst zu implementieren (der wiederrum durch Konfiguration per serviceActivations in der .config und eigenere factory gestartet wird) bekam ich die Fehlermeldung bei der Umstellung vom Attribute aspNetCompatibilityEnabled von "false" auf "true"  das die Assembly 'System.ServiceModel.Activation' nicht gefunden werden konnte. Hier die genaue Fehlermeldung: System.IO.FileNotFoundException: Could not load file or assembly 'System.ServiceModel.Activation' or one of its dependencies. The system cannot find the file specified.File name: 'System.ServiceModel.Activation'   at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMarkHandle stackMark, Boolean loadTypeFromPartialName, ObjectHandleOnStack type)   at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, Boolean loadTypeFromPartialName)   at System.Type.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase)   at System.Web.Compilation.BuildManager.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase)   at System.Web.Configuration.HandlerFactoryCache.GetTypeWithAssert(String type)   at System.Web.Configuration.HandlerFactoryCache.GetHandlerType(String type)   at System.Web.Configuration.HandlerFactoryCache..ctor(String type)   at System.Web.HttpApplication.GetFactory(String type)   at System.Web.HttpApplication.MaterializeHandlerExecutionStep.System.Web.                        HttpApplication.IExecutionStep.Execute()   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)=== Pre-bind state information ===LOG: User = userLOG: DisplayName = System.ServiceModel.Activation (Partial)WRN: Partial binding information was supplied for an assembly:WRN: Assembly Name: System.ServiceModel.Activation | Domain ID: 2WRN: A partial bind occurs when only part of the assembly display name is provided.WRN: This might result in the binder loading an incorrect assembly.WRN: It is recommended to provide a fully specified textual identity for the assembly,WRN: that consists of the simple name, version, culture, and public key token.WRN: See whitepaper http://go.microsoft.com/fwlink/?LinkId=109270 for more information and common solutions to this issue.LOG: Appbase = file:///xxxxx/LOG: Initial PrivatePath xxxx\binCalling assembly : (Unknown).===LOG: This bind starts in default load context.LOG: Using application configuration file: xxxx\web.configLOG: Using host configuration file: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet.configLOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files/root/3d7bd35f/452e5631/System.ServiceModel.Activation.DLL.LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files/root/3d7bd35f/452e5631/System.ServiceModel.Activation/System.ServiceModel.Activation.DLL.LOG: Attempting download of new URL file:///xxxx/bin/System.ServiceModel.Activation.DLL.LOG: Attempting download of new URL file:///Dxxxx/bin/System.ServiceModel.Activation/System.ServiceModel.Activation.DLL.LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files/root/3d7bd35f/452e5631/System.ServiceModel.Activation.EXE.LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files/root/3d7bd35f/452e5631/System.ServiceModel.Activation/System.ServiceModel.Activation.EXE.LOG: Attempting download of new URL file:///xxxx/bin/System.ServiceModel.Activation.EXE.LOG: Attempting download of new URL file:///xxxxx/bin/System.ServiceModel.Activation/System.ServiceModel.Activation.EXE. - Thread: 15Das Problem liegt an einem Eintrag in der web.config, denn dort hatte ich unter system.webserver -> handlers folgenden Eintrag hinzugefügt:<add name="svc" path="*.svc" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation"/>Nach dem Ändern bzw. Ergänzen diesers Eintrages: <add name="svc" path="*.svc" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory,System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />Funktioniert auch wieder die Aktivierung vom WCF basierten REST Service.

HTTP Error 404.11 IIS7 verarbeitet keine URLs mit +

Bei dem IIS 7.5 hatte ich gerade das Problem, dass eine Url die Whitespaces als "+" codiert (auch wenn es nichht optimal ist aber leider nicht zu ändern aktuell) immer mit dem Fehler http Statuscode 404.11 und der Nachricht The request filtering module is configured to deny a request that contains a double escape sequence. beendet wurde. Der Grund für die Ablenhung der Url ist, dass "+" als ein gefährliches Zeichen eingestuft wird. Hierbei handelt es sich also um eine Sicherheitseinstellung.Wenn man nun solche Urls aber weiter verarbeiten möchte, dann kann man diesen Requestfilter einfach deaktivieren über folgenden Aufruf:%windir%System32\inetsrv>appcmd set config -section:system.webServer/security/requestfiltering -allowDoubleEscaping:trueWeitere Informationen zum RequestFiltering gibt es auch hier IIS Security RequestFiltering.

Install ASP.NET 1.1 with IIS7 on Windows 2008

In einer Evaluierungsphase habe ich gerade mal probiert eine alte ASP.Net 1.1 Anwendung auf einem Windows Server 2008 zu installieren. Per Default wird allerdings ASP.NET 1.1 nicht mehr auf einem Windows 2008 Server unterstützt, so das ein wenig manuelle Arbeit notwendig ist.Als erstes muss man die "IIS Metabase Compatibility" installieren und das geht durch die Schritte: "Start" -> "Server Manager" ->  "Manage Roles" -> "Web Server (IIS)" -> "Add Role Services".  Der zweite Schritt ist die Installation vom .Net Framework 1.1. Hier die Downloadlinks:.NET Framework Version 1.1 Redistributable Package.NET Framework Version 1.1 Service Pack 1ASP.NET Security Update for .NET Framework 1.1 SP1Wenn man das Setup ausführt, dann bekommt man vom Windows Server 2008 den Hinweis das es möglicherweise Kompatibilitätsprobleme geben könnte. Diese Meldung einfach mit "Ausführen" / "run programm" überspringen.Anschließend muss das alte .Net Framework noch im IIS registriert werden. Dafür kann man folgenden Behfel ausführen:%windir%\Microsoft.NET\Framework\v1.1.4322\aspnet_regiis -enableEin Änderung in der machine.config (unter %windir%\Microsoft.NET\Framework\v1.1.4322\config\machine.config) muss noch gemacht werden. Vor dem schließenden Tag </configSection> muss folgendes hinzhugefügt werden:<section name="system.webServer" type="System.Configuration.IgnoreSectionHandler,    System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />Einen neue ApplicationPool - der unter .Net 1.1 läuft - kann man nun mit folgendem Befehl anlegen:%windir%\system32\inetsrv\appcmd add apppool /name:"Pool1-1"  /managedRuntimeVersion:"v1.1" Bei einem 64bit Betriebsystem muss man nun noch ein Verzeichnis erstellen:md %windir%\Microsoft.net\Framework64\v1.1.4322\config undcopy %windir%\Microsoft.net\Framework\v1.1.4322\Config\machine.config %windir%\Microsoft.net\Framework64\v1.1.4322\config\machine.config

IIS Manager Error: The process cannot access the file because it is being used by another process. (Exception from HRESULT: 0×80070020)

Heute habe ich versucht bei mir lokal ein SSL Zertifikat zu installieren. So etwas habe ich nicht zum ersten mal gemacht aber heute wollte es einfach nicht funktionieren. Immer wenn ich den IIS entsprechend konfiguriert hatte (Zertifikat importiert, Binding bzw. Hostheader erstellt, etc.) kam beim Versuch den IIS zu starten immer die Meldung:IIS Manager Error: The process cannot access the file because it is being used by another process. (Exception from HRESULT: 0×80070020)Nach der Analyse habe ich dann festgestellt, dass ein Prozess bereits den Port 443 nutzt und daher der IIS mit einem https-Binding natürlich nicht mehr richtig starten konnte. Herausfinden welcher Port aktuell genutzt wird kann man im übrigen über "netstart -ano" im Cmd-Prompt. Der Befehl "Tasklist" hat mir dann den notwendigen Hinweis gegeben. Skype ist der "Bösewicht" der den Port 443 nutzt. Dieses kann man aber per Konfiguration ausschalten. Danach funktioniert auch der Start vom IIS mit einem htts-Binding

WCF URL Rewriting entfernen der Endung "svc"

Bei dem Standardverhalten, wenn ein WCF Service über den IIS veröffentlicht wird ist, dass der Endpunkt die Datei von Service ist mit der Dateiendung ".svc". Dieses sieht aber - gerade im Bezug auf ein REST-basiertes System nicht besonders elegant aus. Bei dem Einsatz von IIS 7.0 ist es sehr einfach die Dateiendung zu entfernen, ohne dabei viel Code zu schreiben. Für das URL Rewriting gibt eine Erweiterung, die man dem IIS 7.0 hinzufügen kann. Dadurch ist es sehr schön möglich z.B. über Regular Expressions ein URL Rewriting durchzuführen. Nach der Installation dieser Erweiterung muss nur noch folgende Regel definiert werden:1. Name: Entfernen der Dateiendung svc2. Request URL: Matches the pattern3. Using: Regular Expressions4. Pattern: ^([0-9a-zA-Z\-]+)/([0-9a-zA-Z\-\.\/\(\)]+) 5. Ignore Cases: true6. Action Type: Rewrite7. Rewrite URL: {R:1}.svc/{R:2}8. Append Querystring: trueFertig ;-)Per Eintrag in der web.config sieht das dann alternativ so aus:  <system.webServer>    <modules runAllManagedModulesForAllRequests="true" />        <rewrite>            <rules>                <rule name="Remove Svc Extension">                    <match url="^([0-9a-zA-Z\-]+)/([0-9a-zA-Z\-\.\/\(\)]+)" />                    <action type="Rewrite" url="{R:1}.svc/{R:2}" />                </rule>            </rules>        </rewrite>  </system.webServer>