Thursday, July 10, 2008

SharePoint 2007 - Using .NET 3.5 AJAX / AjaxControlToolkit

One of the things Microsoft advertised with the release of SharePoint 2007 SP1, was the fact that SharePoint would now jive with AJAX. Although they had previously provided instructions on how to do it before SP1, it was never officially supported.* Unfortunately, once SP1 was released, it wasn't clear on how to get AJAX to work or what you should do if you had followed their previous instructions.

After much troubleshooting, I was finally able to find an easy solution. Essentially, if you had followed the previous instructions that added a couple dozen entries to your web.config, you could now simply use assembly bindings to redirect your old AJAX 1.1 assemblies to the new AJAX 3.5 assemblies.

Instructions

1.) Follow the instructions in the following SharePoint Team Blog post:

Integrating ASP.NET AJAX with SharePoint

2.) Add the following assembly bindings to your SharePoint web.config. (This will redirect your AJAX 1.1 assemblies to use AJAX 3.5.)

<configuration>
   <runtime>
      <assemblyBinding>
         <dependentAssembly>
            <assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
         </dependentAssembly>
         <dependentAssembly>
        <assemblyIdentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
         </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>

I also highly recommend Daniel Larson' blog if you are trying to troubleshoot SharePoint with AJAX.

Daniel Larson's Developer Blog

Update: I am including all web.config settings below. There are a whopping 8 updates!

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<
configuration>
<
configSections>
<!--
AJAX.NET SUPPORT 1 of 8 START-->
<
sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
<
sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
<
section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication" />
<
sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
<
section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="Everywhere" />
<
section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication" />
<
section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication" />
</
sectionGroup>
</
sectionGroup>
</
sectionGroup>
<!--
AJAX.NET SUPPORT 1 of 8 END-->
</
configSections>
<
SharePoint>
<
SafeControls>
<!--
AJAX.NET SUPPORT 2 of 8 START-->
<
SafeControl Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Namespace="System.Web.UI" TypeName="*" Safe="True" />
<!--
AJAX.NET SUPPORT 2 of 8 END-->
</
SafeControls>
</
SharePoint>
<
system.web>
<
httpHandlers>
<!--
AJAX.NET SUPPORT 3 of 8 START-->
<
remove verb="*" path="*.asmx" />
<
add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<
add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<
add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false" />
<!--
AJAX.NET SUPPORT 3 of 8 END-->
</
httpHandlers>
<
httpModules>
<!--
AJAX.NET SUPPORT 4 of 8 START-->
<
add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<!--
AJAX.NET SUPPORT 4 of 8 END-->
</
httpModules>
<
compilation batch="false" debug="true">
<
assemblies>
<!--
AJAX.NET SUPPORT 5 of 8 END-->
<
add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<
add assembly="System.Web.Extensions.Design, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<!--
AJAX.NET SUPPORT 5 of 8 START-->
</
assemblies>
</
compilation>
<
pages enableSessionState="false" enableViewState="true" enableViewStateMac="true" validateRequest="false" pageParserFilterType="Microsoft.SharePoint.ApplicationRuntime.SPPageParserFilter, Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" asyncTimeout="7">
<!--
AJAX.NET SUPPORT 6 of 8 START-->
<
controls>
<
add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<
add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<
add namespace="AjaxControlToolkit" assembly="AjaxControlToolkit, Version=3.0.20229.28221, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e" tagPrefix="ajax" />
</
controls>
<!--
AJAX.NET SUPPORT 6 of 8 END-->
</
pages>
<
trust level="Full" originUrl="" />
</
system.web>
<!--
AJAX.NET SUPPORT 7 of 8 START-->
<
runtime>
<
assemblyBinding>
<
dependentAssembly>
<
assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/>
<
bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
</
dependentAssembly>
<
dependentAssembly>
<
assemblyIdentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35"/>
<
bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
</
dependentAssembly>
</
assemblyBinding>
</
runtime>
<!--
AJAX.NET SUPPORT 7 of 8 END-->
<!--
AJAX.NET SUPPORT 8 of 8 START-->
<
system.web.extensions>
<
scripting>
<
webServices>
<
jsonSerialization maxJsonLength="500000">
<
converters>
</
converters>
</
jsonSerialization>
</
webServices>
<
scriptResourceHandler enableCompression="false" enableCaching="true" />
</
scripting>
</
system.web.extensions>
<
system.webServer>
<
validation validateIntegratedModeConfiguration="false" />
<
modules>
<
add name="ScriptModule" preCondition="integratedMode" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</
modules>
<
handlers>
<
remove name="WebServiceHandlerFactory-ISAPI-2.0" />
<
add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<
add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, &#xD;&#xA; System.Web.Extensions, Version=3.5.0.0, Culture=neutral, &#xD;&#xA; PublicKeyToken=31bf3856ad364e35" />
<
add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, &#xD;&#xA; System.Web.Extensions, Version=3.5.0.0, Culture=neutral, &#xD;&#xA; PublicKeyToken=31bf3856ad364e35" />
</
handlers>
</
system.webServer>
<!--
AJAX.NET SUPPORT 8 of 8 END-->
</
configuration>



* Mike Fitzmaurice was Microsoft's SharePoint Developer Evangelist at the time and is now at Nintex.

1 comment: