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.