search
Twitter Rss Feeds
MicrosoftArticlesForumsGroups
C# .NET
VB.NET
Visual Studio .NET
ADO.NET
Xml/Xslt
VB 6.0
.NET CF
GDI+
LINQ
Deployment
Security
FoxPro
Silverlight / WPF
Entity Framework
RIA Services

Web ProgrammingArticlesForumsGroups
JavaScript
ASP
ASP.NET
Web Services

Non-MicrosoftArticlesForumsGroups
NHibernate
Perl
PHP
Ruby
Java
Linux / Unix
Apple
Open Source

DatabasesArticlesForumsGroups
SQL Server
Access
Oracle
MySQL
Other Databases

OfficeArticlesForumsGroups
Microsoft Excel
Microsoft Word
Microsoft Powerpoint
Publisher
Money

Operating SystemsArticlesForumsGroups
Windows 7
Windows Server
Windows Vista
Windows XP
Windows Update
MAC
Linux / UNIX

Server PlatformsArticlesForumsGroups
Share Point
BizTalk
Site Server
Exhange Server
IIS
Transaction Server

Graphic DesignArticlesForumsGroups
Macromedia Flash
Adobe PhotoShop
Microsoft Expression

OtherArticlesForumsGroups
Subversion / CVS
Ask Dr. Dotnetsky
Active Directory
Networking
Uninstall Virus
Job Openings
Reviews
Search Engines
Resumes

 
Call a .NET Webservice using XMLHTTP,XMLDOM and VBScript

By Peter A. Bromberg, Ph.D.

Peter Bromberg

The appearance of Visual Studio .NET at the Professional Developers Conference in Orlando this July gave birth to a whole new world of exposed http-addressable services and component methods available to developers over the web. The Microsoft code name for this "bundle of joy", as it were, is "webservices". If webservices were a stock, I wouldn't short it just yet. It promises to be one of the most exciting new concepts on the web since Al Gore invented it. If you're not sure why webservices holds such promise, look at the diverse list of authors of the W3C SOAP 1.1 Specification and that should give you a clue:

http://www.w3.org/TR/2000/NOTE-SOAP-20000508/

The Microsoft flavor of webservice is not only incredibly easy to create using the Visual Studio IDE and the language of your choice in the Common Language Runtime (CLR), but they are also callable through SOAP and other methods including a straight HTTP GET with the parameter(s) name and value(s) on the querystring.

Lets take a look at a sample webservice that Microsoft exposes to the public, examine its interface, and write a HTTP page to access this service and present the results.  Actually, unlike most "examples", the page I have in mind is one that is quite useful and that you might very well want to have on your website. It's the MSDN Search Beta "Best Bets" webservice method. What this does is take your search phrase and match it up to a cached set of "Best Bet" matches at MSDN and return the result as well-formed XML.

Here is a link to the  the webservice "disco" page so you can see how a Microsoft webservice exposes itself:

http://beta.search.microsoft.com/search/

The webservice method we will be using is the second one, "GetBestBets."  To see what the result of a search will look like, click the link below for a search on "XML":

http://beta.search.microsoft.com/search/MSComSearchService.asmx/GetBestBets?Query=XML

What we'll do now is write a page with the least possible amount of code that will present a search form and display the items from the result XML document in a nice table, converting the "Title" element from each node into a nice hyperlink to its corresponding "Url" element, in a nice HTML table just below the Search form. We'll do this in a narrow 130 pixel wide table column so that the code can be inserted on the left or right side column of your web page.

First let's take a look at all the code, and then we'll walk through it:

<script language="VBScript" runat=Server>
function getResults()
Dim xmlDOC
Dim bOK
Dim HTTP
Set HTTP = CreateObject("MSXML2.XMLHTTP")
Set xmlDOC =CreateObject("MSXML.DOMDocument")
xmlDOC.Async=False
HTTP.Open "GET","http://beta.search.microsoft.com/search/MSComSearchService.asmx/GetBestBets?Query=" 
& document.all("SearchTerm").value , False
HTTP.Send()
bOK = xmlDOC.load(HTTP.responseXML)
if Not bOK then
	rtext.innerText = "Error loading XML from HTTP"
end if
' Note: Instead of making an XSL transform Stylesheet, we will use the selectNodes Method 
' with the XPath "//" search directive to get the ifornmation we want to display out of the
' XML DOMDocument. We'll use this to create our HTML Table "on the fly"
Dim objNodeListUrl
DIm objNodeListTitle
Set objNodeListUrl=xmlDOC.documentElement.selectNodes("//Url")
Set objNodeListTitle=xmlDOC.documentElement.selectNodes("//Title")
rtext.innerText = "Len: "& objNodeListUrl.Length
Dim I
Dim sTable
sTable = "<tableborder:1px solid black"" width=""130"">"
sTable=sTable &  "<trfont-size:8pt; font-family:Verdana; font-weight:bold; "
sTable =sTable & " text-decoration:underline"">"
sTable = sTable & "<td align=""center"">Results:</TD>"
For I = 0 to objNodeListUrl.Length -1
	sTable = sTable & "<trfont-family:Verdana; font-size:8pt; padding:0px 2px""><td>"
	sTable = sTable & "<a href=" & objNodeListUrl(i).text & ">"
	sTable = sTable & objNodeListTitle(i).text & "</a></TD>"
next
sTable=sTable & ""
rtext.innerHTML = sTable
stat.innerText ="Status: " & HTTP.statusText
end Function
</script>
<div align=Center><font face=Tahoma size=2><b>MSDN "Best Bets":</b><br>
  Enter Search Term</FONT><b><br>
  <input type="text" name="SearchTerm" value="" size=12>
  <br>
  <input type="button" value="Get Results" onClick="getResults()">
  </div>
<center>
<div id=rtext></div><p>
<div id=stat></div>

 

The first part of our code is the VBScript function getResults(). This is called via the onClick event of the button control, and sets references to the XMLHTTP object we'll use to send our request, and the XMLDOMDocument object we'll use to hold the well-formed XML document that the webservice returns to our page.

We set the async property to "false" - we want to wait until our result comes back. We call the XMLHTTP.Open method with "GET" because that is what the webservice is looking for. To the querystring, we append the value for SearchTerm that the user entered into the form with document.all("SearchTerm").value, and then we call the Send() method to send our XMLHTTP request over the wire.

If everything works, we get back our response XML in the xmlDOC.load(HTTP.responseXML) and our XMLDOMDocument is in xmlDOC.

Now we can do whatever we need to get out the pertinent information and display it the way we want. Normally I would load an XSL Styesheet in a separate DOMDocument and call xmlDOC.transformNode(xslDOC) to get my HTML for display. But here, we really need such a small amount of information from the xml aggregate that instead we'll use some XPATH to "extract" the values from the nodelists we need, and simply create our HTML table "inline".

So the next step is that we define two nodelists with:

Dim objNodeListUrl
Dim objNodeListTitle
Set objNodeListUrl=xmlDOC.documentElement.selectNodes("//Url")
Set objNodeListTitle=xmlDOC.documentElement.selectNodes("//Title")

This give us two node lists, one containing all the "Url" element values, and the other containing all the "Title" values, and now we have everything we need to construct our table of titles and associated hyperlinks.

We start building our table HTML in the strTable variable, and iterate through the nodelists with:

For I = 0 to objNodeListUrl.Length -1

and we concatenate our string with the objNodeListUrl(i).text and objNodeListTitle(i).text values. The result is a string containing our HTML table, and we set the value of the <div> tag rtext.innerHTML to this string. To try it out, Click here. You can get the source by simple saving the page after you've tried it.

Peter Bromberg is a Senior Programmer /Analyst at FiServ, Inc. in Orlando and a co-developer of the EggheadCafe.com developer website. He can be reached at pbromberg@yahoo.com



Pete's Blog   |    Pete's Resume   |    Robbe's Blog   |    Robbe's Resume   |    Archive #2   |    Archive #3   |    Dotnetslackers   |    XmlPitStop   |    Advertise   |   Contact Us   |   Privacy   |   Copyright (c) 2000 - 2009 eggheadcafe.com  All rights reserved.