I know this has been addressed before but I have service that returns a string like so.
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[System.Web.Script.Services.ScriptService]
public class MyService : System.Web.Services.WebService
{
[WebMethod]
public string Hello()
{
System.Threading.Thread.Sleep(10000);
return "Hello User";
}
}
I've read many examples that say I need to call the method like this:
MyService my = new MyService();
AsyncCallback async = new AsyncCallback(callback);
my.BeginHello();
Console.WriteLine("Called webservice");
The thing is when I added reference I coudn't get the BeginHello method. All I saw was the HelloAsync. So I used it like this in my console app.
MyService my = new MyService();
AsyncCallback async = new AsyncCallback(callback);
my.HelloAsync();
Console.WriteLine("Called webservice");
and defined a private callback method like this
private void callback(IAsyncResult res)
{
Console.Write("Webservice finished executing.");
}
In doing so, I get an error like this:
An object reference is required for the non-static field, method, or property 'AsyncWebserviceCall.Program.callback(System.IAsyncResult)
Why dont I get the BeginHello method & Why do I get this error as above?
Thanks for your time.
If the code is being run inside your public static void Main(string[] args)
function then you need to make private void callback(IAsyncResult res)
a static method:
private static void callback(IAsyncResult res)
{
Console.Write("Webservice finished executing.");
}
That's why you're getting that error.
From ASP.NET 2.0 onwards there were some changes to how you make async web service calls. Do this instead:
MyService my = new MyService();
my.HelloCompleted += CallBack;
my.HelloAsync();
Console.WriteLine("Called service.");
Console.ReadLine(); // Wait, otherwise console app will just exit.
Your callback method signature changes to:
private static void CallBack(object sender, HelloCompletedEventArgs e)
{
Console.WriteLine("Webservice finished executing.");
}
More info:
From Visual Studio 2005 onwards the Add Web Reference proxy generator no longer creates the BeginXXX/EndXXX
methods. These methods were deprecated in favour of the XXXAsync/XXXCompleted
pattern.
If you really need to work with the BeginXXX/EndXXX
style async methods you can use one of the following methods:
Use the WSDL.exe
tool to create the proxy. For example:
wsdl.exe /out:MyService.cs http://somedomain.com/MyService.asmx?wdsl
Include the generated MyService.cs
file in your project and use that instead of a Web Reference. You need to open a Visual Studio command prompt for this so that the .NET Framework SDK binaries are in your path.
There is apparently a hack in Visual Studio (it may no longer be available). For more info see this MS Connect case:
Begin/End Async WebService Proxy Methods Not Generated in Web Application Projects
My advice would be to embrace the new approach.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With