In my previous article, I introduced the plan to use Visual Basic 6.0 (VB6) to consume a .NET Web service. I also presented sample code for the Web service and discussed how to get this service operational. Now I'll explain how to create a proxy in .NET for consuming the .NET Web service. I will also build and register the proxy component for use in VB6. Finally, I'll present sample code for using the proxy within VB6.
Creation of the Web service
Since .NET has the internal workings for hosting and consuming Web services, I used .NET to create the Web service. I relied on ASP.NET Web Matrix's Web Service Proxy Generator to create the code (which was created to consume the service in .NET). From the Tools menu option, choose the Web Service Proxy Generator. The information necessary to complete this step consists of the WSDL URL, the namespace of the proxy, the output directory, and the source file name. The WSDL URL is nothing more than the URL of your .asmx Web service file. You can choose any namespace you wish, but it's a good idea to be consistent. For instance, my namespace is set to MyWebServiceProxy; I used UserServiceProxy.cs as the source file name. Considering that I was going to create a .NET project to add this file to, I entered the same output directory where I was going to make my project. (Note: Do not generate the assembly.)
Let the project begin
Now it's time to create a new project in Visual Studio .NET. This project Output Type should be a Class Library project. I named my project MyWebServiceProxy. Inside this project, I added the UserServiceProxy.cs source file. I also changed a few of the visibility statements in this class. The resulting code should look similar to Listing A.
Now, follow these steps:
- Right-click the project name in the Project Explorer and choose Properties.
- In Configuration Properties | Build, set the Register For COM Interop option to True.
- To build the project, create a new Standard EXE project in VB6.
- Add a reference to the MyWebServiceProxy type library.
- On the default form, add a CommandButton control.
- In the CommandButton control's Click event, add the following code:
Dim o As MyWebServiceProxy.UserService
Dim usr As MyWebServiceProxy.User
Set o = New MyWebServiceProxy.UserService
Set usr = o.GetUser(1)
MsgBoxusr.FirstName & " " & usr.LastName
IntelliSense gives you the public classes of the MyWebServiceProxy library; however, you may not get the members (i.e., GetUser() method, etc.) available to the classes. This doesn't mean that you can't use them—it just means that you'll either have to rely on reference or memory. You can also fix this by implementing an interface. (This may be a smarter approach, but it isn't necessary for the purposes of this article.)
Run the code and see what you get. If everything is set up correctly, you should get a message box with the user's first and last name where the user id is 1.
Overcoming security hurdles
The biggest hurdle you may run into is security. If you get an "access denied" error, then you have a couple of options. The first is to impersonate the anonymous account from IIS. In your web.config file for your Web service, make sure to add the Identity node and set the Impersonate attribute to True. In Internet Services Manager, change the File Security on your .asmx file. Set the anonymous account name to a system or domain user account that has sufficient privileges to access the resources needed by the Web service. If all else fails, then use an administrator account for this exercise. Try the code again and see what you get.
Another option is to set the userName and password attributes in the Identity node in the web.config file. Once again, set this to an appropriate account. Also, don't forget to include the impersonate attribute.
If you'd like the source code for these examples, you can download them from this zip file.
Keep your developer skills sharp by automatically signing up for TechRepublic's free Web Development Zone newsletter, delivered each Tuesday.