Oude artikelen van mijzelf: Webservices

C

Lang geleden (2005) heb ik meerdere C# blogposts geschreven die ik kwijt ben geraakt. Maar dankzij verschillende chinese en indische blogs heb ik wat artikelen terug kunnen vinden. Hieronder een over webservers.

Webservices, an introduction

Webservices are used to share data between applications. Webservices are not .Net specific, but in .Net they are very easy to create. Webservices use XML to transfer data. In this example I will explain a webservice which returns the based on an IP Address. It uses the code described in the article: Visitor’s .

You can see the webservice in action by opening the following : GetCountryFromIP.asmx

Creating the Webservice

If you create a new webservice using Visual Studio you will have your first working webservice. The code added by Visual Studio is basically all you need. It even contains a webmethod for the famous “Hello World”. You can see the Hello World webservice by opening the following link: HelloWorld.asmx

   1:  using System;
   2:  using System.Collections;
   3:  using System.ComponentModel;
   4:  using System.Data;
   5:  using System.Diagnostics;
   6:  using System.Web;
   7:  using System.Web.Services;
   8:
   9:  namespace markberck.WebServices
  10:  {
  11:      //
  12:      // Summary description for HelloWorld.
  13:      //
  14:      public class HelloWorld : System.Web.Services.WebService
  15:      {
  16:          public HelloWorld()
  17:          {
  18:              //CODEGEN: This call is required by the ASP.NET Web Services Designer
  19:              InitializeComponent();
  20:          }
  21:
  22:          Component Designer generated code#region Component Designer generated code
  23:
  24:          //Required by the Web Services Designer
  25:          private IContainer components = null;
  26:
  27:          //
  28:          // Required method for Designer support - do not modify
  29:          // the contents of this method with the code editor.
  30:          //
  31:          private void InitializeComponent()
  32:          {
  33:          }
  34:
  35:          //
  36:          // Clean up any resources being used.
  37:          //
  38:          protected override void Dispose( bool disposing )
  39:          {
  40:              if(disposing && components != null)
  41:              {
  42:                  components.Dispose();
  43:              }
  44:              base.Dispose(disposing);
  45:          }
  46:
  47:          #endregion
  48:
  49:          // WEB SERVICE EXAMPLE
  50:          // The HelloWorld() example service returns the string Hello World
  51:          // To build, uncomment the following lines then save and build the project
  52:          // To  this web service, press F5
  53:
  54:          [WebMethod]
  55:          public string HelloWorld()
  56:          {
  57:              return "Hello World";
  58:          }
  59:      }
  60:  }

GetCountry Method

The webservice that is build uses the following code, you might recognize it from the article Visitor’s Country. I’ve added some extra input checks, because we cannot use RegularExpressionValidator on the input.

    1:  public string GetCountry(string IPAddress)
   2:  {
   3:      if (IPAddress.IndexOf(".") > -1)
   4:          if (IPAddress.Split('.').GetUpperBound(0) == 3)
   5:          {
   6:              string ConnectionString =
   7:                  ConfigurationSettings.AppSettings["sqlConString"];
   8:              string sqlQuery = "GetCountryFromIP ";
   9:              sqlQuery += IPAddress.Split('.')[0] + ", ";
  10:              sqlQuery += IPAddress.Split('.')[1] + ", ";
  11:              sqlQuery += IPAddress.Split('.')[2] + ", ";
  12:              sqlQuery += IPAddress.Split('.')[3];
  13:
  14:              SqlConnection sqlCon = new SqlConnection(ConnectionString);
  15:              SqlCommand sqlCom    = new SqlCommand(sqlQuery, sqlCon);
  16:
  17:              string country;
  18:              try
  19:              {
  20:                  sqlCon.Open();
  21:                  country = sqlCom.ExecuteScalar().ToString();
  22:              }
  23:              catch
  24:              {
  25:                  country = "Unknown (IP Address could be a local network)";
  26:              }
  27:              finally
  28:              {
  29:                  sqlCon.Close();
  30:              }
  31:              return country;
  32:          }
  33:      return "Please enter a correct IP Address!";
  34:  }

The current method isn’t a webmethod yet. To do this you’ll need to add the WebMethod attribute ([WebMethod]).

GetCountry Method #2

I’ve created an overload for the GetCountry Method, which doesn’t need an IP Address as input. It uses the visitors IP Address (using HttpContext.Request.ServerVariables["REMOTE_ADDR"]) as input.

   1:  public string GetCountry()
   2:    {
   3:        string ipAddress = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
   4:        return this.GetCountry(ipAddress);
   5:    }

Both methods aren’t available as WebMethod, because they miss the [WebMethod] attribute. But if we add the attribute to both methods, you will receive an error when you open the webservice (it will compile without any warnings/errors). This is because there are two GetCountry methods. In a normal application they are distinguished by its signature (which variables (or of which type) it need as input, or which return type it has), but a WebService can’t.

Therefore we have to describe the separate methods. The WebMethod attribute uses some properties for this; you can add a description (which is just what it says it is) and a MessageName. The MessageName property allows the method to be accessed by a different name. For the overload method (which returns your own country I’ve added the following attribute (with properties):

    [WebMethod( Description="Get Your Country", MessageName="GetOwnCountry")]

For the original method, I’ve added the webmethod with different properties (with only a description):

    [WebMethod(Description="Get Country for IP Address")]

Adding it all together

When we add this all into one class we’ll end up with the following code:

   1:  using System;
   2:  using System.Web;
   3:  using System.Web.Services;
   4:  using System.Configuration;
   5:  using System.Data.SqlClient;
   6:
   7:  namespace markberck.WebServices
   8:  {
   9:      [WebService(
  10:           Description="Get Country based on IP Address",
  11:           Namespace="http://markberck.nl/webservices/")]
  12:      public class GetCountryFromIP : System.Web.Services.WebService
  13:      {
  14:          [WebMethod(
  15:               Description="Get Your Country",
  16:               MessageName="GetOwnCountry")]
  17:          public string GetCountry()
  18:          {
  19:              string ipAddress =
  20:                  HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
  21:              return this.GetCountry(ipAddress);
  22:          }
  23:          [WebMethod(Description="Get Country for IP Address")]
  24:          public string GetCountry(string IPAddress)
  25:          {
  26:              if (IPAddress.IndexOf(".") > -1)
  27:                  if (IPAddress.Split('.').GetUpperBound(0) == 3)
  28:                  {
  29:                      string ConnectionString =
  30:                          ConfigurationSettings.AppSettings["sqlConString"];
  31:                      string sqlQuery = "GetCountryFromIP ";
  32:                      sqlQuery += IPAddress.Split('.')[0] + ", ";
  33:                      sqlQuery += IPAddress.Split('.')[1] + ", ";
  34:                      sqlQuery += IPAddress.Split('.')[2] + ", ";
  35:                      sqlQuery += IPAddress.Split('.')[3];
  36:
  37:                      SqlConnection sqlCon = new SqlConnection(ConnectionString);
  38:                      SqlCommand sqlCom    = new SqlCommand(sqlQuery, sqlCon);
  39:
  40:                      string country;
  41:                      try
  42:                      {
  43:                          sqlCon.Open();
  44:                          country = sqlCom.ExecuteScalar().ToString();
  45:                      }
  46:                      catch
  47:                      {
  48:                          country = "Unknown (IP Address could be local network)";
  49:                      }
  50:                      finally
  51:                      {
  52:                          sqlCon.Close();
  53:                      }
  54:                      return country;
  55:                  }
  56:              return "Please enter a correct IP Address!";
  57:          }
  58:      }
  59:  }

Deel dit:

  • Twitter
  • Facebook
  • Digg
  • NuJIJ
  • Hyves
  • eKudos
  • Google Bookmarks
  • LinkedIn
  • Add to favorites
  • PDF
  • email
This entry was posted in Microsoft, Ouder, Privé and tagged , , , , , , , , . Bookmark the permalink.

Comments are closed.