jeudi 17 mars 2011

ASP.NET - Problème d’Ajax sur Chrome et Safari

Sur mon site SharePoint, j’ai des ApplicationPage ou des webparts contenant de l’Ajax de MS.

Parfois, sur certains appels, les navigateurs sous webkit (Safari, Chrome) me renvoient l’erreur suivante :

Uncaught Sys.ScriptLoadFailedException: Sys.ScriptLoadFailedException: Échec du chargement du script 'http://dev2008/ScriptResource.axd?d=UWfXBVZmHMLaD9yazDm3XCZ1zh7gE0VbTVJs-BJ2wUiVXFWLG3ZiCsDINgJQjFMAPY0wxaBY-pp9eZhQNhP0y-I86N1uMrSe_7z7leFAxDedMNEoRb2dmo3NoyO7pbno5N3XRdEOvlAKSmJYeyoOmKNssMKeamFzDiHavM1oTZMoZZCts9toMuUQPcYX99NBuI94Mg2&t=ffffffffdf363b93'. Vérifiez les éléments suivants :
Chemin d'accès inaccessible.
Erreurs de script. (Internet Explorer) Activez 'Afficher une notification de chaque erreur de script' dans les paramètres avancés.
Appel manquant à Sys.Application.notifyScriptLoaded().
Sys$WebForms$PageRequestManager$_scriptIncludesLoadCompleteScriptResource.axd:1266
Sys$WebForms$PageRequestManager$_scriptIncludesLoadFailedScriptResource.axd:1304
(anonymous function)ScriptResource.axd:31
(anonymous function)ScriptResource.axd:47
Sys$_ScriptLoader$_raiseErrorScriptResource.axd:3656
Sys$_ScriptLoader$_scriptLoadedHandlerScriptResource.axd:3677
(anonymous function)ScriptResource.axd:47
(anonymous function)

Après de longues recherches, j’ai trouvé ce post très intéressant qui corrige le problème :

http://forums.asp.net/p/1252014/2392110.aspx

Donc voici rapidement la solution que j’ai mis en place sur mon site SharePoint :

Dans ma masterpage, j’ai ajouté un lien vers un fichier de hack dans le scriptmanager :

<asp:ScriptManager ID="ScriptManager1" runat="server" 
EnablePartialRendering="true"
EnableScriptLocalization="true" EnableScriptGlobalization="true">
<Scripts>
<asp:ScriptReference Path="/_layouts/Extranet/js/WebKitAjaxHack.js" />
</Scripts>
</asp:ScriptManager>



Et voici le contenu de ce fichier WebKitAjaxHack.js :



Sys.Browser.WebKit = {}; //Safari + chrome
if (navigator.userAgent.indexOf('WebKit/') > -1) {
Sys.Browser.agent = Sys.Browser.WebKit;
Sys.Browser.version = parseFloat(navigator.userAgent.match(/WebKit\/(\d+(\.\d+)?)/)[1]);
Sys.Browser.name = 'WebKit';
}


Une fois la masterpage publier ainsi que le fichier js, tous mes appels fonctionnent sans erreur.