Der Handler "ExtensionlessUrlHandler-Integrated-4.0" hat ein fehlerhaftes Modul "ManagedPipelineHandler" in seiner Modulliste


252

Um ehrlich zu sein, habe ich versucht, einen schmutzigen Trick mit IIS zu machen, und als ich dachte, ich würde damit durchkommen, wurde mir klar, dass meine Problemumgehung nicht funktioniert. Folgendes habe ich versucht:

1) Ich habe eine ASP.NET-Anwendung mit einer Preloader- Klasse, die IProcessHostPreloadClient erbt und die gesamte umfangreiche Initialisierung bei der Implementierung der Preload- Methode durchführt (die Anwendung ist komplex und Teil eines riesigen Systems, sodass etwa 2 Minuten erforderlich sind, um Verbindungen zu allen erforderlichen Verbindungen herzustellen Dienste und einige Unity-Registrierungen vorab instanziieren).

2) Ich habe eine Menge Arbeit, die beim Herunterfahren der Anwendung erledigt werden muss (Abbestellen, Trennen, Entsorgen, ...), und ich denke, der beste Ort dafür ist die * Application_End * -Methode in Global.asax .

3) Alles funktioniert einwandfrei, wenn ich Benutzeraktivität habe (die erste Anforderung nach dem Start des Anwendungspools, der die oben genannte Webanwendung enthält, führt dazu, dass * Application_Start * aufgerufen wird und anschließend * Application_End * beim Stoppen oder Recyceln des Anwendungspools aufgerufen wird), aber Probleme Tritt auf, wenn keine Benutzeraktivität vorliegt und die Anwendung versucht, sich nach 48 Stunden Aktivität neu zu starten (konfigurierte Anforderung). Da es keine Anfragen gab, wurde die Bewerbung offiziell nicht gestartet. Ergo kann es nicht ordnungsgemäß gestoppt werden, da * Application_End * nicht aufgerufen wird.

4) Jetzt kommt der unordentliche Teil ... Ich habe versucht, am Ende der Preload- Methode eine GET-Anfrage aus dem Code zu stellen , und es hat funktioniert. Aber diese Lösung schien mir schlecht, obwohl sie funktionierte. Also habe ich viele Dinge ausprobiert und das Letzte, was ich versucht habe, war Folgendes:

SimpleWorkerRequest swr = new SimpleWorkerRequest(string.Empty, string.Empty, tw);
HttpRuntime.ProcessRequest(swr);

... und das hat seinen Zweck erfüllt. * Application_Start * wurde aufgerufen (ich habe die Antwort überprüft, sie enthielt die Anmeldeseite, die bei der ersten Anforderung angezeigt werden sollte), und beim Herunterfahren des Anwendungspools wurde die Anwendung ordnungsgemäß beendet, indem die erforderlichen Arbeiten in * Application_End * ausgeführt wurden.

ABER

Nachdem die Anwendung auf diese Weise gestartet (vorinstalliert und initiiert) wurde, geschah Folgendes, als ich die Anwendung über einen Webbrowser erreichen wollte:

HTTP-Fehler 500.21 - Interner Server-Fehlerbehandler "ExtensionlessUrlHandler-Integrated-4.0" hat ein fehlerhaftes Modul "ManagedPipelineHandler" in seiner Modulliste

Ich kann das nicht herausfinden. Kann mir jemand sagen, warum dies passiert und wie man es behebt?

Wenn ich das nicht herausfinde, werde ich zur ersten Lösung zurückkehren (GET-Anfrage vom Code senden), aber dieses Problem wird mich nerven, da ich nicht einmal eine Idee habe, was falsch ist.


Welche IIS-Version verwenden Sie?
Chue x

IIS 7.5 (7.5.7600.16385)
Ivan Peric

Keine direkte Antwort auf Ihre Frage, aber für andere Benutzer mit ähnlichen Problemen und unter der Annahme, dass Sie eine Internetanwendung haben: Sie können einfach einen externen Dienst wie uppimerobot.com verwenden , um Ihre Anwendung alle X Male zu berühren. Sie halten Ihre App im laufenden Zustand + Sie haben die zusätzlichen Vorteile des Dienstes (Verfügbarkeit, Warnungen usw.).
Qbantek

@qbantek Obwohl die Anwendung, an der ich arbeite, nicht mit dem Internet verbunden ist, haben Sie mir eine gute Idee gegeben. Ich könnte Load Balancer verwenden, um regelmäßige Berührungen durchzuführen, indem ich den Typ für die Überprüfung des Gesundheitszustands auf Simple HTTP GET setze. Vielen Dank
Ivan Peric

Antworten:


24

Das Problem

Sie verwenden SimpleWorkerRequest in einem Szenario, für das es nicht entwickelt wurde. Sie verwenden es in IIS . Wenn Sie sich den vorherigen MSDN-Link ansehen (Schwerpunkt liegt bei mir):

Bietet eine einfache Implementierung der abstrakten Klasse HttpWorkerRequest, mit der ASP.NET-Anwendungen außerhalb einer IIS-Anwendung (Internet Information Services) gehostet werden können . Sie können SimpleWorkerRequest direkt einsetzen oder erweitern.

Wenn Sie sich die MSDN-Dokumentation für den System.Web.Hosting-Namespace ansehen ( SimpleWorkerRequestbefindet sich in diesem Namespace), sehen Sie auch etwas Ähnliches wie oben (der Schwerpunkt liegt wieder bei mir):

Der System.Web.Hosting-Namespace bietet die Funktionalität zum Hosten von ASP.NET-Anwendungen aus verwalteten Anwendungen außerhalb von Microsoft Internet Information Services (IIS) .

Die Lösung

Ich würde empfehlen, den Anruf zu entfernen SimpleWorkerRequest. Stattdessen können Sie eine Microsoft-Lösung verwenden, um sicherzustellen, dass Ihre Website nach dem Recycling automatisch gestartet wird. Was Sie benötigen, ist das Microsoft Application Initialization Module für IIS 7.5 . Die Konfiguration ist nicht kompliziert, aber Sie müssen die genauen Optionen kennen. Deshalb würde ich auch das empfehlen Benutzeroberfläche für Anwendungsinitialisierung für IIS 7.5 . Die Benutzeroberfläche wird von einem MSDN-Blogger geschrieben.

Was genau macht die Microsoft-Lösung? Es macht das, was Sie versuchen - IIS sendet nach dem Start des Anwendungspools eine "Get" -Anforderung an Ihre Website.


2
Ich war auf der Suche nach einer Lösung, die in Code implementiert werden kann, aber dies kommt einem "gut genug" so nahe wie es nur geht, also vergebe ich das Kopfgeld dafür. Aber ich denke, die von @danijelk bereitgestellte Lösung wird für die meisten Menschen am nützlichsten sein, die auf diese Frage aus einem anderen als dem von mir angegebenen Grund stoßen. Dies ist also eine Notiz, die sie sich ansehen sollten.
Ivan Peric

650

Versuchen Sie, ASP.NET bei neu zu registrieren aspnet_regiis -i. Es hat bei mir funktioniert.

Ein wahrscheinlicher Pfad für .NET 4 (von der Eingabeaufforderung mit erhöhten Rechten):

c:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i

http://forums.iis.net/p/1190643/2026401.aspx


Vielen Dank für Ihre Antwort. Ich habe das schon versucht und es hat nicht funktioniert. :( -
Osama Khodrog

8
Funktioniert nicht für Windows Server 2012. Lesen Sie Zachs Beitrag auf dieser Seite.
Ivan Akcheurov

Vielen Dank. Arbeitete für mich auf einer virtuellen Maschine in Azure. Was ich jedoch gerne wissen würde, ist, warum ich dies bei einer neuen Installation tun müsste. Sicherlich registriert sich ASPNET bei der Installation selbst, oder? Ich vermute, es hat etwas mit der Reihenfolge der Installation zu tun.
David Bridge

4
Wenn Sie .NET 4.5.x oder 4.6.x verwenden, lassen Sie sich nicht von der Antwort täuschen, in der 4.0 erwähnt wird, und denken Sie, dass sie nicht auf Sie zutrifft. Dieses Problem kann mit der Reihenfolge der Installation von .NET vor IIS zusammenhängen, wie es für mich war. Durch Ausführen des Befehls (in meinem Fall die 64-Bit-Version) wurde das Problem behoben, obwohl meine Anwendung .NET 4.5.2 verwendet.
Coxy

Windows 2008, Neuinstallation AWS Microserver verlangte von mir, diesen Befehl auszuführen. Nur für diejenigen von uns, die der Meinung sind, dass er für ihr System nicht relevant ist.
Terary

170

Wenn dieser Fehler mit Windows 8 / Windows Server 2012 und .Net 4.5 auftritt, befolgen Sie diese Anweisungen hier: http://www.britishdeveloper.co.uk/2013/01/handler-extensionlessurlhandler.html

Gehen Sie zu "Windows-Funktionen ein- oder ausschalten", dann zu Internetinformationsdiensten, dann zu World Wide Web Services und dann zu Anwendungsentwicklungsfunktionen, und aktivieren Sie dann ASP.NET 4.5

Dies hat bei mir funktioniert (obwohl der Assistent und der Wortlaut in Windows Server 2012 etwas anders sind, aber Sie werden es herausfinden). Warum dies nach der Installation aller Elemente über das Web Platform Installer einschließlich aller Abhängigkeiten erforderlich ist, ist mir völlig unverständlich ...


3
Das Konfigurieren von Windows Server ist eine PITA. Warum gibt es kein zentrales Paketverwaltungssystem?
Kugel

Wenn Sie iis mit einer Webplattform installiert haben, suchen Sie nach dem Kommentar von Virgo139, der mein Problem leicht löste
castors33

Dies war die Lösung für mich unter Windows 10 Pro Build 1607, Prost!
Apogee

Dies hat es auch für Windows 10 behoben. Erwähnenswert ist, dass die allgemeine Befehlszeilenkorrektur (aspnet_regiis.exe -i) unter Windows 10 nicht zulässig ist.
Nat Webb

Bestätigte Lösung für Windows 10 Pro.
Zoomzoom

59

Obwohl ich den meisten Ratschlägen auf dieser Seite gefolgt bin, gab es unter Windows Server 2012 immer noch Probleme. Durch die Installation von .NET Extensibility 4.5 wurde das Problem für mich behoben:

Add Roles and Features > Server Roles > Web Server (IIS) > Web Server > Application Development > .NET Extensibility 4.5


2
Vielen Dank für die Formulierung, ich starrte viel zu lange auf Webserver -> Webserver -> Webserver-Pipe ... :)
Gleno

2
Vergessen Sie nicht, Rollen und Funktionen> Serverrollen> Webserver (IIS)> Webserver> Anwendungsentwicklung> ASP.NET 4.6 (oder 4.5, abhängig von Ihrem Setup) zu überprüfen
Lionet Chen

1
Ja, dann starten Sie den IIS-Dienst neu. Hat für mich gearbeitet! Vielen Dank. +1
Rusty Nail

47

Verwenden Sie für Windows 10 / Windows Server 2016 den folgenden Befehl:

dism /online /enable-feature /featurename:IIS-ASPNET45 /all

Die vorgeschlagenen Antworten mit aspnet_regiisfunktionieren nicht unter Windows 10 (Creators Update und höher) oder Windows Server 2016:

C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ aspnet_regiis.exe -i
Microsoft (R) ASP.NET RegIIS Version 4.0.30319.0
Verwaltungsdienstprogramm zum Installieren und Deinstallieren von ASP.NET auf dem lokalen Computer.
Copyright (C) Microsoft Corporation. Alle Rechte vorbehalten.
Starten Sie die Installation von ASP.NET (4.0.30319.0).
Diese Option wird von dieser Version des Betriebssystems nicht unterstützt. Administratoren sollten stattdessen ASP.NET 4.5 mit IIS8 über das Dialogfeld "Windows-Funktionen ein- / ausschalten", das Server-Manager-Verwaltungstool oder das Befehlszeilentool dism.exe installieren / deinstallieren. Weitere Informationen finden Sie unter http://go.microsoft.com/fwlink/?LinkID=216771 .
Installation von ASP.NET (4.0.30319.0) abgeschlossen.

Interessanterweise konnte ich im Dialogfeld "Windows-Funktionen ein- / ausschalten" weder .NET noch ASP.NET 4.6 deaktivieren, und nur der obige Befehl DISM funktionierte. Ich bin mir nicht sicher, ob der Name der Funktion korrekt ist, aber es hat bei mir funktioniert.


Dies hat das Problem für mich behoben. Ich habe Windows 10 Pro mit dem Ersteller-Update ausgeführt. Vielen Dank!
Samuel Poirier

Legendäre Antwort! Ich musste meinen Webserver neu erstellen und hatte die Skripte seit einigen Jahren nicht mehr aktualisiert. Ich habe diesen DISM-Befehl zu meinen VM-Bereitstellungsskripten hinzugefügt. Das funktioniert wie ein Zauber.
Chris Schaller

dism / online / enable-feature / featurename: IIS-ASPNET45 / all Arbeitete für mich unter Windows Server 2016
Syed Nasir Abbas

Dank dir habe ich noch einen Job! :) Hat funktioniert.
Scott

42

Führen Sie einen der folgenden Befehle aus:

Für 32-Bit-Windows-Betriebssysteme:

c:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i

Für 64-Bit-Windows-Betriebssysteme:

c:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -I

Dabei ist mir aufgefallen, dass der Ordner "aspnet_client" der Website im Verzeichnis "Sites" von IIS Connections
hinzugefügt wird

26

Diese https://stackoverflow.com/a/13266763/1277458 funktioniert einwandfrei. Wenn Sie jedoch ein 64-Bit-Betriebssystem haben, verwenden Sie Framework64 anstelle von Framework im Pfad:

c:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -i

FWIW, Server 2012 R2 sagt, dass diese Option nicht unterstützt wird, und schlägt vor, das Dialogfeld "Funktion" zu verwenden, um ASP.NET 4.5
bvj

Ja, Zachs Antwort deckt dies ab.
Neshta

13

In meinem Fall (Windows 10 + IIS 10) musste ich " Windows-Funktionen aktivieren oder deaktivieren " öffnen und dann zu Internetinformationsdienste> World Wide Web Services> Anwendungsentwicklungsfunktionen> gehen und ASP.NET 4.6 überprüfen


1
Meins war IIS unter Windows 2012 R2. Das kompatible ASP.NET wurde unter Server-Manager> Verwalten> Rollen und Funktionen hinzufügen> Rollenbasierte oder funktionsbasierte Installation> (Server auswählen)> Webserver (IIS)> Webserver> Anwendungsentwicklung> ASP.NET 4.5 hinzugefügt. Wie @ArsmanAhmad sagte, besteht eine gute Überprüfung darin, zu überprüfen, ob Ihre .NET CLR-Version für den App-Pool auf Version 4.0 eingestellt ist.
GBU

6

Dies zu einem eigenen Beitrag zu machen, weil ich stundenlang damit beschäftigt war.

Ich habe hier und anderswo vielleicht ein Dutzend ähnlicher Beiträge über dieses Problem und die Behebung von aspnet_regiis gesehen. Sie arbeiteten nicht für mich und aspnet_regiis verhielt sich seltsam, listete nur Optionen usw. auf.

Wie der Benutzer ryan-anderson oben angegeben hat, können Sie .exe nicht eingeben

Für diejenigen, die mit Dingen außerhalb von IIS auf dem Server weniger vertraut sind, tun Sie Folgendes in einfachen Schritten.

  1. Suchen Sie aspnet_regiis in einem Ordner, der diesem Pfad ähnlich ist. c: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \

  2. Klicken Sie im Startmenü oder wo auch immer mit der rechten Maustaste auf die Eingabeaufforderung und weisen Sie sie an, als Administrator ausgeführt zu werden. Die Verwendung der Windows-Funktion "Ausführen" funktioniert einfach nicht oder nicht für mich.

  3. Kehren Sie zur ausführbaren Datei aspnet_regiis zurück. Klicken und ziehen Sie es direkt in die Eingabeaufforderung oder kopieren Sie die Adresse in die Eingabeaufforderung.

  4. Entfernen Sie, falls vorhanden, die EXE-Datei am Ende. Das ist der Schlüssel. Fügen Sie am Ende das -i (Leerzeichen minus Auge) hinzu. Eingeben.

Wenn Sie dies richtig gemacht haben, werden Sie sehen, dass es beginnt, asp.net zu installieren, und Ihnen dann mitteilen, dass es erfolgreich war.


Hat perfekt für mich funktioniert. Danke dir.
Mike

5

Stellen Sie sicher, dass Sie Ihre application-siteVersion von v2.0bis v4.0in IIS Manager festgelegt haben :

Anwendungspools> Ihre Anwendung> Erweiterte Einstellungen> .NET Framework-Version

Danach installieren Sie Ihre ASP.NET.

Für 32-Bit-Betriebssysteme (Windows):

C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ aspnet_regiis.exe -i

Für 64-Bit-Betriebssysteme (Windows):

C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ aspnet_regiis.exe -i

Starten Sie Ihren application-sitein IIS Manager neu und genießen Sie.


Ja, ich habe mein Bestes versucht, um die Antwort so einfach wie möglich zu gestalten. ;-) @yuyangJian
Arsman Ahmad

4

Ich weiß, dass dies ein Oldie ist, dachte aber, ich könnte einen Mehrwert schaffen. Für diejenigen von uns, die Server Core außerhalb einer Domäne ausführen (Domänenmitglieder können den Server-Manager nur remote ausführen, um Funktionen / Rollen hinzuzufügen / zu entfernen), müssen Sie auf Befehlszeilen zurückgreifen.

Powershell-Benutzer können "Install-WindowsFeature Web-Asp-Net45" eingeben.

Dies sollte der Verwendung des Server-Managers entsprechen.


4

Ich wurde von der gleichen Fehlermeldung mit .net 4.7 herausgefordert.

Die Lösung bestand darin, einem zuvor erwähnten Beitrag zu folgen, um mit der Funktion "Windows ein- oder ausschalten" zu beginnen, in der "Erweiterte Dienste für .NET Framework 4.7" -> "ASP.NET 4.7" bereits aktiviert war.

Weiter unten in der Liste befinden sich die "Internetinformationsdienste" und die Unternote "Anwendungsentwicklungsfunktionen" -> "ASP.NET 4.7", die ebenfalls überprüft werden müssen.

Wenn Sie dies aktivieren, werden viele andere Funktionen aktiviert ... Ich habe einfach die OK-Taste gedrückt und das Problem wurde behoben. Screendump des Windows-Funktionsdialogs


Ich sollte hinzufügen, dass dies eine Windows 10 Pro Edition war
theodor.johannesen

2

Ich arbeite an Windows Server 2012. Die Funktion .NET Extensibility 4.5 ist aktiviert. WebDAVModule entfernt. Ich habe immer noch einen 500.21-Fehler auf der ASP.NET-Route '/ docs' erhalten.

Das Ändern von 'skipManagedModules' in false hat das Problem behoben.

<applicationInitialization doAppInitAfterRestart="true" skipManagedModules="false">
        <add initializationPage="/docs" />    
</applicationInitialization>

Vielen Dank an https://groups.google.com/forum/#!topic/bonobo-git-server/GbdMXdDO4tI


2

Ich habe dieses Problem gelöst und in "Windows-Funktionen aktivieren oder deaktivieren" die Option ASP.NET 4.7 hinzugefügt

Geben Sie hier die Bildbeschreibung ein


1

Ich hatte dieses Problem und stellte fest, dass das Entfernen des folgenden Ordners auch bei der Nicht-Express-Edition hilfreich war. Express:

C:\Users\<user>\Documents\IISExpress


1

Dieser Fehler ist mir letzte Woche aus dem Nichts passiert und hat sich auf die vorhandenen Websites auf meinem Computer ausgewirkt. Ich hatte kein Glück damit, einen der Vorschläge hier auszuprobieren. Schließlich habe ich WebDAV vollständig aus IIS entfernt (Windows-Funktionen -> Internetinformationsdienste -> World Wide Web-Dienste -> Allgemeine HTTP-Funktionen -> WebDAV-Veröffentlichung). Danach habe ich aus gutem Grund einen IIS-Reset durchgeführt, und mein Fehler wurde schließlich behoben.

Ich kann nur vermuten, dass ein Windows-Update das Problem ausgelöst hat, bin mir aber nicht sicher.


Hatte gerade das gleiche Problem. Installierte einige Windows-Updates, die meine IIS-Einstellungen umstellten. Durch Deaktivieren von WebDAV Publishing wurde das Problem erneut behoben.
ElliotSchmelliot

0

Sie können das Problem beheben, indem Sie den Typ "ExtensionlessUrlHandler-Integrated-4.0" in iis in System.Web.DefaultHttpHandler ändern


0

Beim Entfernen von WebDAV von meinem Server hat die Anwendung 503 Service Unavailablebei Verwendung von PUToder eine Fehlermeldung zurückgegebenDELETE , sodass ich sie erneut installiert habe. Ich habe auch versucht, .NET Framework 4.5 vollständig zu entfernen und neu zu installieren. Außerdem habe ich versucht, mich wie vorgeschlagen neu zu registrieren, aber ohne Erfolg.

Ich konnte dies beheben, indem ich WebDAV für den einzelnen Anwendungspool deaktivierte. Dadurch wurde der Fehler "Bad Module" bei Verwendung von PUToder gestoppt DELETE.

Deaktivieren Sie WebDAV für den individuellen App-Pool:

  1. Klicken Sie auf den betroffenen Anwendungspool
  2. Finden Sie WebDAV Authoring Toolsin der Liste
  3. Klicken Sie, um es zu öffnen
  4. Klicken Sie Disable WebDAVoben rechts.

Ta daaaa!

Ich habe die entfernten Elemente immer noch in meiner web.configDatei belassen .

 <system.webServer>
    <modules>
      <remove name="WebDAVModule"/>
    </modules>
    <handlers>
      <remove name="WebDAV" />
    </handlers>
 <system.webServer>

Über diesen Link habe ich die Anweisungen gefunden, aber es ist nicht sehr klar.


0

Dies ist möglicherweise keine nützliche Lösung für OP, betrifft jedoch dieselbe "Fehlermeldung".

Wir hosten PHP-Seiten auf IIS8.5 mit korrekt installiertem .NET 4.5.

Wir nutzen die Preload-Funktion, um sicherzustellen, dass unsere Anwendung immer auf der ganzen Linie reagiert.

Nach einer Weile wurde dieser Fehler zufällig angezeigt.

In der web.config: Ich setze skipManagedModules auf true, -> mach das nicht!

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
<applicationInitialization skipManagedModules="false" doAppInitAfterRestart="true">
  <add initializationPage="/" />
</applicationInitialization>
...

Obwohl die Website PHP ist, wird das Routing zum Paging von den Modulen verwaltet !!!


0

Ich bin auch auf dieses Problem gestoßen. Meine MVC4-App wird unter Windows Server 2012 R2 mit IIS 8.5 ausgeführt. Keine dieser veröffentlichten Lösungen hat bei mir funktioniert ... Die Installation der fehlenden Frameworks über IIS-Funktionen hätte das Problem möglicherweise beheben können, aber die Installation ist immer fehlgeschlagen.

Ich musste Web Platform Installerdie folgenden Pakete verwenden und installieren:

Geben Sie hier die Bildbeschreibung ein


0

Ich hatte dieses Problem in einer Webanwendung, die auf einem gemeinsam genutzten Hosting-Server gehostet wurde. Offensichtlich hatte er keinen direkten Zugriff auf IIS und konnte daher viele der hier vorgeschlagenen Lösungen nicht anwenden.

In der Systemsteuerung des Hosting-Anbieters habe ich die Fehlerprotokollierung für IIS und ASP.Net aktiviert. Und dann erfuhr ich, dass der Fehler tatsächlich in einem fehlenden cshtml lag.


0

Die Installation von .NET 4.7 hat bei mir funktioniert. Ich hatte vorher nur 3.5 installiert.Geben Sie hier die Bildbeschreibung ein

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.