5
votes

I'm exposing a web service in a SharePoint site e.g. http://server/_vti_bin/subdir/mywebservice.asmx.

In the web service method, SPContext.Current appears to be null.

(Interestingly, I'm looking at an example in Chapter 5 of Inside Windows SharePoint Services 3.0 and they use SPContext.Current inside a web service!)

Any idea what am I missing? Thanks in advance.

3
Could you supply some more info and perhaps code samples? Which specific object in SPContext.Current is null? How do you obtain credentials for the web service? what authentication are you using?Anders Rask
+hosting IIS site is Windows authN. (How can this be related to SPContext.Current being null?)Ariel

3 Answers

2
votes

The only times when I saw a SPContext.Current = null was when the webservice was called at a virtual location that didn't exist (i.e. an URL that was only half correct).

In your problem specification, you mention "_vti_bin/subdir". I have not seen this subdir construct in a WebService hosted within SharePoint yet (disclaimer: my knowledge is limited to 2 or 3 working implementations of a custom webservices within SharePoint)

Normally, you'd

  • Put the asmx straight into the ISAPI folder of the 12 hive. This will map onto _vti_bin.
  • Put the assembly, if any, in the GAC (or in the website bin, but I'd suggest using the GAC until you get the basics up and running)
  • Do stuff for discovery if you really need to, but for testing this shouldn't be necessary

It might not be related at all, but I'd still try to get things working from the _vti_bin first, then try and mess with subfolders. SharePoint's url virtualization can be painful.

0
votes

Is it possible that your subdirectory is set up as a web application and is therefore operating in a different context?

0
votes

How are you calling the webservice? Is this an ajax call from javascript/jquery? If yes, have you added the ScriptService attribute on the webservice class?

[System.Web.Scripts.Services.ScriptService]
public class SimpleWebService : System.Web.Services.WebService
{
    ...
    ...
}