VC# Express Beta2 and MapPoint WebService (oh man!)

I'm currently working on an article introducing C# Express edition for one of the local developer magazines and my plan was to take the ScreenSaver example that ships with the product and extend it a little. In particualr, I wanted to introduce the concept of calling web services. Instead of using a folder with images as the background for the screensaver, I wanted to pull down a map centred on an address that the user entered into the options dialog (and then verified via MapPoint's FindServiceSoap service).

So, I added a reference to the MapPoint wsdl and away I went. Things started getting strange when I called the service. In particular, I'd get an exception:

 Server did not recognize the value of HTTP Header SOAPAction:
   https://s.mappoint.net/mappoint­-30/FindAddress. 

Long story short, what it looks like is happenning is that the WSDL generator that generates reference.cs is not handling the fact that MapPoint has 4 services defined in the WSDL (Common, Find, Render and Route), that is to say, it's kind of recognising the fact in that it generates stubs for all of those services and their methods and data types, it just gets it wrong.

Each of the services needs a separate URL to call the methods, but the code just seems to use the first one it finds in the WSDL (in this case, the URL for the Common service) . There's only one entry in the Settings where there should be four and the Reference.cs code only uses that one setting.

To fix this manually, add the following settings to the Settings.Settings (You'll obviously need to change ScreenSaver1 to the name of your project, or call it whatever you want, as long as you reference it correctly in Reference.cs)

Name Type Scope Value
ScreenSaver1_net_mappoint_staging_FindService (Web Service URL) Application https://findv3.staging.mappoint.net/Find-30/FindService.asmx
ScreenSaver1_net_mappoint_staging_RouteService (Web Service URL) Application https://routev3.staging.mappoint.net/Route-30/RouteService.asmx
ScreenSaver1_net_mappoint_staging_RenderService (Web Service URL) Application https://renderv3.staging.mappoint.net/Render-30/RenderService.asmx

Now open up Reference.cs (easiest way to do this is to right-click on one of the web service objects and choose Go To Definition) and fix the settings for each of the 3 services

 public RenderServiceSoap() {
   this.Url = ScreenSaver1.Properties.Settings.Default.ScreenSaver1_net_mappoint_staging_CommonService;

becomes

 public RenderServiceSoap() {
   this.Url = ScreenSaver1.Properties.Settings.Default.ScreenSaver1_net_mappoint_staging_RenderService;
 public RouteServiceSoap() {
   this.Url = ScreenSaver1.Properties.Settings.Default.ScreenSaver1_net_mappoint_staging_CommonService;

becomes

 public RouteServiceSoap() {
   this.Url = ScreenSaver1.Properties.Settings.Default.ScreenSaver1_net_mappoint_staging_RouteService;

and

 public FindServiceSoap() {
   this.Url = ScreenSaver1.Properties.Settings.Default.ScreenSaver1_net_mappoint_staging_CommonService;

becomes

 public FindServiceSoap() {
   this.Url = ScreenSaver1.Properties.Settings.Default.ScreenSaver1_net_mappoint_staging_FindService;

I'm sure this will be fixed during the Beta process.

Hope this helps some folk.