Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / productivity / SharePoint

Troubleshooting an Issue With Calling an asmx Web Service in SharePoint 2010 through jQuery

5.00/5 (1 vote)
17 Apr 2014CPOL1 min read 14.9K  
Here is our tip on how to troubleshoot an issue with calling asmx web service in SharePoint 2010 through jQuery

There are several issues that can happen while migrating SharePoint from one version to another. Here is our tip on how to troubleshoot an issue with calling asmx web service in SharePoint 2010 through jQuery.

After migration of a SharePoint 2007 application to SharePoint 2010 our jQuery scripts that communicate with ASMX web services suddenly stopped working. We got the error “500 Internal Server Error”. The scripts looked as follows:

$.ajax({
  type: "POST",
  url:  "http://someserver/someapp/_layouts/Services/Products.asmx/GetProductByCountry",

  data:        JSON.stringify({ countryCode: "USA" }),
  dataType:    "json",
  contentType: 'application/json; charset=utf-8',
  context:     this,
 
  success: function (data) {
             alert(data.d);
           },
  error:   function (XMLHttpRequest, textStatus, errorThrown) {
             alert(textStatus);
           }
});

Note: The JSON object mentioned in the script is defined in the json2.js available at http://www.json.org.

This issue can be solved by adding an appropriate <webServices> section to the web.config of SharePoint application (in our case it’s located at C:\inetpub\wwwroot\wss\VirtualDirectories\80).

So, find the global <system.web> section in your web.config and make changes so that the result looks like this:

<system.web>
  <webServices>
    <protocols>
      <add name="HttpGet" />
      <add name="HttpPost" />
    </protocols>
  </webServices>
...
</system.web>

However, from the security standpoint such solution is not ideal as it allows external access through the HTTP-GET and HTTP-POST messaging protocols to all of your XML web services. So, it’s better to specify the access protocols for each web service separately, not affecting other ones. The <location> element added to the root <configuration> element provides us with this capability. The sample below defines the protocols for accessing the web service reachable by the specified path:

<configuration>
...
  <location path="_layouts/Services/Products.asmx">
    <system.web>
      <webServices>
        <protocols>
          <add name="HttpGet"/>
          <add name="HttpPost"/>
        </protocols>
      </webServices>
    </system.web>
  </location>
...
</configuration>

Note that the _layouts virtual directory is available as a subfolder of every SharePoint Web site. So if you want to limit web service usage by only one SharePoint Web site, specify the path as follows: someapp/_layouts/Services/Products.asmx.

PS Here is a good article about how to create a custom web service in SharePoint 2010.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)