Creating a Webservice Part 1 of 2by Dave, webmaster of 123aspx.com Secure Webs, I decided to expose my site, http://www.123aspx.com , as a web service. I wanted to start with something simple, so I decided to expose the "What's New" ASP.NET resources. The "what's new" section contains the latest 12 additions to my site. Here is a quick tutorial around writing that webservice. Webservices in ASP.NET are built around the SOAP (Simple Object Access Protocol) and WSDL (Web Services Description Language). We're not going to get into these standards (WSDL, and SOAP), but instead, focus on creating a webservice and consuming it Planning I decided to return a dataset object as my collection of new resources. I chose a dataset because most ASP.NET developers are already familiar with datasets, and they can easily be bound to datagrids. The dataset consists of 4 columns: Name - the name or title of the resource. URL - The url to the resource Domain - The domain name the resource can be found at. DateUpdated - The date the resource was updated. LayoutWe start programming a webservice by declaring it to the .NET engine and importing the following namespaces: <%@ WebService Language="VB" Class="AspX123WebSvc" %> Option Strict On Option Explicit On Imports System Imports System.Data Imports System.Data.SqlClient Imports System.Web Imports System.Web.Services Imports Microsoft.VisualBasic We also need to tell the compiler that the class "AspX123WebSvc" will be webservice enabled. We do this by inheriting the WebService namespace in the class declaration. Public Class AspX123WebSvc : Inherits WebService Now that we have our classes defined, I went ahead and declared the main function. Getting To It
Because we are declaring a method here, we need to mark it as a webservice method using <webmethod()> Public Function GetNewResources() As DataSet I decided to add a friendly description to this method, to tell the consumer what this method does. When we view the default WSDL, supplied natively by ASP.NET, our description will show be available to the consuming programer. Once we have our functions and classes declared, writing a webservice is just like writing any other codebehind file. Accessing the Database Now that I have my webservice framework in place, let's go ahead and get our our data. In this example, I need to massage the data a little bit, specifically the domain name of the ASP.NET resource. So what I decided to do, was to return a datareader, strip off only the domain name of the resource (instead of returning the complete url), and then build the dataset that we will eventually be returning. To access the database I use 2 utility functions. One function is called GetDataReader( ) and the other function is called sqlConnString(). . GetDataReader() returns a SqlDataReader, it also takes advantage of System.Data.CommandBehavior.CloseConnection. System.Data.CommandBehavior.CloseConnection is a parameter that tells the framework to close the datareader as soon as I'm done reading from it. sqlConnString() is used to read my SQL Server connection string from the web.config file. I've included a snippet from my web.config file to display how I'm adding an appsettings section to web.config. GetDataReader() Private Function GetDataReader(sqlText as String) as SqlDataReader Dim dr as SqlDataReader Dim sqlConn as SqlConnection = new SqlConnection( sqlConnString() ) Dim sqlCmd as SqlCommand = new SqlCommand( sqlText, sqlConn ) sqlCmd.Connection.Open() dr = sqlCmd.ExecuteReader( System.Data.CommandBehavior.CloseConnection )
Return dr End Function
sqlConnString() Private Function sqlConnString() as String Return System.Configuration.ConfigurationSettings.AppSettings("WebSvcDb") End Function
web.config <appSettings> <add key="WebSvcDb" value="Password=;User ID=sa;Initial Catalog=pubs;Data Source=127.0.0.1;" /> </appSettings> Getting the Data I have a stored procedure called "s_res_whats_new". I execute the stored procedure to return the datareader. I also create my dataset that I will be passing back to the webservice. REM -- get the data from the database Dim sqlText as String = "exec s_res_whats_new" Dim dbRead as SqlDataReader = GetDataReader( sqlText )
REM -- create the datatable Dim ds as DataSet = New DataSet("NewResources") Dim dt as DataTable = ds.Tables.Add("ResourceList") Dim dr as DataRow
Assembling the DataSet Once I had a datareader back from my database, full of new resources, I loop through the datareader to create a dataset. The reason I didn't bring back the dataset directly, is because I needed to modify some of the data, before I sent it out as the webservice, mainly the Date and Domain name. I modify the date, to have a short date format, and I modify the url to only return the domain name part of the url. For example, if I was referencing the resource http://www.aspfree.com/authors/Default.asp, I only want to return www.aspfree.com. Once I have the parameters URL, DateUpdated, Domain, and Resource Name, I add them to a datarow and add the datarow to a datatable, which is part of the dataset. Here is the code I use to loop through the datareader and compile the dataset. REM -- get the data from the database Dim sqlText as String = "exec s_res_whats_new" Dim dbRead as SqlDataReader = GetDataReader( sqlText )
REM -- create the datatable Dim ds as DataSet = New DataSet("NewResources") Dim dt as DataTable = ds.Tables.Add("ResourceList") Dim dr as DataRow
while dbRead.Read() DateUpdated = DateTime.Parse(dbRead.Item("res_dateupdated").ToString()) ResourceName = dbRead.Item("res_name").ToString() ResourceUrl = dbRead.Item("res_url").ToString() ResourcePk = dbRead.item("res_pk").ToString()
ResourceDomain = "" If len(ResourceUrl)>PROT_PRFX_LEN then REM -- Strip off 'http://' and remove everything after .com, .net, or .org, or less than 25 characters UrlWhatsNew = ResourceUrl & "/" ResourceDomain = LCASE(Left(Mid(UrlWhatsNew, PROT_PRFX_LEN ,Instr(PROT_PRFX_LEN,UrlWhatsNew,"/")-PROT_PRFX_LEN),MAX_DOMAIN_LEN)) End if ResourceDate = DateUpdated.ToShortDateString() ResourceUrl = "http://www.123aspx.com/resdetail.asp?rid=" & ResourcePk
REM -- Add to DataSet ds dr = dt.NewRow() dr("URL") = ResourceUrl dr("DateUpdated") = ResourceDate dr("Domain") = ResourceDomain dr("Name") = ResourceName
dt.Rows.Add(dr) End While
Here I manipulated the "res_dateupdated" field by first converting it to a date. Because sql server is storing the date as a long date (mm/dd/yy with seconds), I needed to parse the date to return only mm/dd/yy. Creating a short date can be done by the following line: res_date = date_dateupdated.ToShortDateString() I added each local variable to a column in a datarow, and then added the row to the dataset. After the datareader had finished looping, I returned the Dataset. Testing Now it was time to test my webservice. ASP.NET provides a default page for testing webservices. If you look closely, you will see the description:"Returns the latest 12 New and Updated Resources at http://www.123aspx.com" that we used to describe our method GetNewResources. ASP.NET returns a webservice in the form of the industry strandard, WSDL protocol. WSDL is an XML document that will tell the consumer what methods are available to be called, and can be considered a type of API. We can now test our webservice by clicking the Invoke button. Here is a screen shot of the first 3 rows of data that will be sent to the consumer. Conclusion ASP.NET makes it extremely easy for us to build webservices. Once we have a basic understanding of how ASP.NET works, it isn't that hard to extend our knowledge to webservices.
| DISCLAIMER: The content provided in this article is not warranted or guaranteed by Developer Shed, Inc. The content provided is intended for entertainment and/or educational purposes in order to introduce to the reader key ideas, concepts, and/or product reviews. As such it is incumbent upon the reader to employ real-world tactics for security and implementation of best practices. We are not liable for any negative consequences that may result from implementing any information covered in our articles or tutorials. If this is a hardware review, it is not recommended to open and/or modify your hardware. |
More ASP.NET Articles More By aspfree developerWorks - FREE Tools! | Join this webcast, to learn how the Rational Process Library can help with compliance issues, drive process improvement, and assist in service-oriented architecture (SOA) or Agile development. We will take a peek into the Rational Process Library with content around software and systems engineering (including RUP), operations and systems management, program and portfolio management, and asset and SOA governance. FREE! Go There Now!
| | | | David Barnes, Lead Evangelist for IBM Emerging Internet Technologies will discuss aspects of Web 2.0 that bring value to corporations, academia, and government. He'll also discuss IBM's vision around Web 2.0, including the importance of remixability and consumability. The discussion will culminate with examples of various IBM Software Group solutions you can use to get ahead of the Web 2.0 adoption curve. FREE! Go There Now!
| | | | Learn to enable users to both rate existing animations and to combine existing animations into new snippets. This is the third in a series of three tutorials that chronicle the building of a site that enables collaborative discussion and animation building using Domino and OpenLaszlo. FREE! Go There Now!
| | | | WebSphere Process Server delivers a unique integration framework that simplifies existing IT resources. Often, as IT assets grow to support business demand, so too does their complexity and manageability. In this webcast, we’ll discuss how WebSphere Process Server helps deliver an SOA infrastructure that provides a common model to orchestrate, mediate, connect, map, and execute the underlying IT functions. Discover how WebSphere Process Server simplifies integration of business processes by leveraging existing IT assets as reusable services without the complexities of traditional integration methodologies. FREE! Go There Now!
| | | | Download a free trial version of IBM Rational Developer for System z, software that can help you deliver core development capabilities; the power of Java Platform, Enterprise Edition (Java EE); and rapid application development support to diverse enterprise application development teams. With comprehensive development tools to help create, deploy and maintain traditional enterprise and composite applications, Rational Developer for System z enables developers with different technical backgrounds to easily participate in important technology projects. FREE! Go There Now!
| | | | Manage, govern, and share services across your organization by using WebSphere Service Registry and Repository. Follow the hands-on exercises to learn how to navigate the Web interface to publish, find, reuse, and update services. FREE! Go There Now!
| | | | Portfolio Management is about effectively managing portfolio value by aligning portfolio investments with business goals. This complimentary e-kit provides a collection of materials that can help you understand how IBM Rational enables and automates best practices for improved governance and clear visibility into portfolio and project performance across the entire IT project lifecycle. FREE! Go There Now!
| | | | Discover how Rational tools and best practices for testing can make your job easier. The new Rational Testing eKits provide you with valuable resources – including demos, webcasts, tutorials, and articles – that help you address your specific testing needs across the software lifecycle. Five new eKits are available covering the topics of Requirements and Test Management, Functional Testing, Performance Testing, Code Quality and Embedded Systems, and SOA and Web Services Testing. FREE! Go There Now!
| | | | Regression testing -- in which code is thoroughly tested to ensure that changes have not produced unexpected results -- is an important part of any development process. But many testing environments neglect the terminal-based applications that still form the backbone of many industries. In this tutorial, you'll learn how the Rational Functional Tester Extension for Terminal-Based Applications works with other Rational Functional Tester to help test terminal-based applications quickly and easily. FREE! Go There Now!
| | | | The discipline of assembling and delivering software is maturing beyond standard developer-centric compile/test software builds. The end-to-end software development lifecycle is emerging as the new focus moves “Beyond the Build.” Join this on demand webcast to learn about methods for streamlining software delivery and key capabilities of the IBM Rational Build Forge framework for automating build and release management in environments of any size. FREE! Go There Now!
| | | | All FREE IBM® developerWorks Tools! | |