Wednesday, July 15, 2009

Custom web services in SharePoint 2007 - Web.config changes – Part 2

Please read the article "Steps to implement web service 2.0 in SharePoint" before continue this post. Then you will get some idea on what is the need of change in web.config for implementing custom web service 2.0 in SharePoint.

SharePoint framework don't allow to call web services from java script by default. For this, we explicitly tell the web application that when any request from javascript to web services then use this http handlers, http modules and allow *.asmx files to serve in SharePoint.

So, please follow the steps below.

Changes required in the sections.

  • HttpHandlers and httpModules in <System.Web> section.
  • Adding a new section named <System.WebServer>.
  • This is not needed, but useful if you have installed two versions of Ajax libraries[1.0 and 3.5] for System.Web.Extensions. Assembly binding redirect in <runtime>
  • Add  System.web.Extensions assembly to the <assemblies> section. This is very important.

Please add the sections as it is in the web.config file of your SharePoint web site to get the web services 2.0 work.

1. <httpHeaders> section:
    <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"/></httpHandlers>

2. <httpModules> section:

    <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>

3. <System.WebServer> section:

<system.webServer>
        <validation validateIntegratedModeConfiguration="false"/>
        <modules>
            <remove name="ScriptModule"/>
            <add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        </modules>
        <handlers>
            <remove name="WebServiceHandlerFactory-Integrated"/>
            <remove name="ScriptHandlerFactory"/>
            <remove name="ScriptHandlerFactoryAppServices"/>
            <remove name="ScriptResource"/>
            <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, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
            <add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        </handlers>
    </system.webServer>

4. <runtime> Section:

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <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>

5. <assemblies> section:

Add this entry to <assemblies> section.

<add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />

That’s it!!! With these changes it will allow you to access web services from java script. I spent my valuable time to find this way to solve so many problems. Do you like this?

1 comment:

  1. I think there's a mistake. "" instead of "<httpHeaders". Or, am I wrong?

    ReplyDelete