WebService
Børre Stenseth
Moduler>Webservices>Sonetter

Shakespears sonetter

Hva
En enkel webservice

Vi lager en enkel WebService som skal returnere en av Shakespeares sonetter. Vi velger hvilken ved å sende et tall i området [1..154]. Datagrunnlaget er en XML-fil som er nærmere beskrevet i modulen: Noen datasett

Vi bygger en Web Service i Visual Studio. Vi lager ServiceSonette.asmx og App_Code/ServiceSonette.cs, og vi plasserer fila: App_Data/sonetter.xml.

Fila ServiceSonette.asmx inneholder kun en linje som kopler oss til kodefila:

<%@ WebService Language="C#" CodeBehind="~/App_Code/ServiceSonette.cs" 
               Class="ServiceSonette" %>

Koden ser slik ut, etter at vi har redigert den:

using System;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml;

/// <summary>
/// Summary description for ServiceSonette
/// </summary>
[WebService(Namespace = "http://www.donau.hiof.no/borres/dn/demosite1/s2/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class ServiceSonette : System.Web.Services.WebService {
    public ServiceSonette()
    {
    }

    [WebMethod(Description = "Returnerer en sonette som en string-array." +
                             "Input er et heltall i omr�det [1..154]")]
    public string[] Sonette(int n)
    {
        n = Math.Min(Math.Max(0,n-1), 153);
        string physicalPath = HttpContext.Current.Server.MapPath(".").ToString();
        String filename = physicalPath + "\\App_Data\\sonetter.xml";
        String[] result;
        try
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(filename);
            XmlNodeList list = doc.GetElementsByTagName("sonnet");
            result = new string[list[n].ChildNodes.Count];
            list[n].Normalize();
            XmlNode nod = list[n].FirstChild;
            int ix = 0;
            while (nod != null)
            {
                result[ix++] = nod.InnerText;
                nod = nod.NextSibling;
            }
        }
        catch (Exception ex)
        {
            result = new string[] { "Fant ingen", "sonnette" };
        }
        return result;
    }    
}
Vi kan nå se hvordan denne tjenesten presenterer seghttp://donau.hiof.no/borres/dn/service1/ServiceSonette.asmx

Bruk fra et program

Image-app

Vi lager på vanlig måte en Windows Application i Visual Studio. I Solution Explorer, under References, legger vi til en WebReference og oppgir url'en til vår webservice: "http://donau.hiof.no/borres/dn/service1/ServiceSonette.asmx". Vi kaller den "sonette".

Vi kan da skrive følgende kode:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace UseSonette
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            ShowSonette(1);
        }
        private void button1_Click(object sender, EventArgs e)
        {
            try{
                int n=Convert.ToInt32(textBox2.Text);
                if( (n > 154) || (n < 1) )
                    throw new Exception();
                ShowSonette(n);
            }
            catch(Exception ex){
                label3.Visible=true;
            }
         }
        private void ShowSonette(int n)
        {
            sonette.ServiceSonette son = new sonette.ServiceSonette();
            textBox1.Lines = son.Sonette(n);
            label3.Visible = false;
        }
    }
}

Bruk fra webside

Framgangsmåten blir den samme som fra et program.

Vi kan da skrive følgende kode:

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class Default2 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        
        if (!this.IsPostBack)
        {
            TextBox2.Text = "1";
            ShowSonette(1);
        }
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        try
        {
            int n = Convert.ToInt32(TextBox2.Text);
            if ((n < 1) || (n > 154))
                throw new Exception();
            ShowSonette(n);
        }
        catch (Exception ex)
        {
            Label3.Visible = true;
        }
    }
    protected void ShowSonette(int n)
    {
        String T = "";
        sonette.ServiceSonette son=new sonette.ServiceSonette();
        String[] slist=son.Sonette(n);
        for(int ix=0;ix<slist.Length;ix++)
            T+="\n"+slist[ix];
        TextBox1.Text = T;
        Label3.Visible = false;
    }
}
Du kan teste herhttp://donau.hiof.no/borres/dn/demosite2/Default2.aspx
Du kan se hvordan tjenesten presenterer seg herhttp://donau.hiof.no/borres/dn/service1/ServiceSonette.asmx

Fler detaljer

Fila som beskriver tjenesten sett fra programmet side ser slik ut:

<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
                  xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" 
                  xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
                  xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" 
                  xmlns:tns="http://www.donau.hiof.no/borres/dn/demosite1/s2/" 
                  xmlns:s="http://www.w3.org/2001/XMLSchema" 
                  xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" 
                  xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" 
                  targetNamespace="http://www.donau.hiof.no/borres/dn/demosite1/s2/" 
                  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
  <wsdl:types>
    <s:schema elementFormDefault="qualified" 
              targetNamespace="http://www.donau.hiof.no/borres/dn/demosite1/s2/">
      <s:element name="Sonette">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="1" maxOccurs="1" name="n" type="s:int" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="SonetteResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="SonetteResult" 
                       type="tns:ArrayOfString" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:complexType name="ArrayOfString">
        <s:sequence>
          <s:element minOccurs="0" maxOccurs="unbounded" name="string" 
                     nillable="true" type="s:string" />
        </s:sequence>
      </s:complexType>
    </s:schema>
  </wsdl:types>
  <wsdl:message name="SonetteSoapIn">
    <wsdl:part name="parameters" element="tns:Sonette" />
  </wsdl:message>
  <wsdl:message name="SonetteSoapOut">
    <wsdl:part name="parameters" element="tns:SonetteResponse" />
  </wsdl:message>
  <wsdl:portType name="ServiceSonetteSoap">
    <wsdl:operation name="Sonette">
      <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
        Returnerer en sonette som en string-array. 
        Input er et heltall i området [1..154]
      </wsdl:documentation>
      <wsdl:input message="tns:SonetteSoapIn" />
      <wsdl:output message="tns:SonetteSoapOut" />
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="ServiceSonetteSoap" type="tns:ServiceSonetteSoap">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="Sonette">
      <soap:operation 
        soapAction="http://www.donau.hiof.no/borres/dn/demosite1/s2/Sonette" 
        style="document" />
      <wsdl:input>
        <soap:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:binding name="ServiceSonetteSoap12" type="tns:ServiceSonetteSoap">
    <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="Sonette">
      <soap12:operation 
        soapAction="http://www.donau.hiof.no/borres/dn/demosite1/s2/Sonette" 
        style="document" />
      <wsdl:input>
        <soap12:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap12:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="ServiceSonette">
    <wsdl:port name="ServiceSonetteSoap" binding="tns:ServiceSonetteSoap">
      <soap:address 
        location="http://donau.hiof.no/borres/dn/service1/ServiceSonette.asmx" />
    </wsdl:port>
    <wsdl:port name="ServiceSonetteSoap12" 
               binding="tns:ServiceSonetteSoap12">
      <soap12:address 
        location="http://donau.hiof.no/borres/dn/service1/ServiceSonette.asmx" />
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>
Referanser
  • Webservice sonette (og webservice latin):
    https://svn.hiof.no/svn/psource/Csharpsites/service1
  • Bruk fra program:
    https://svn.hiof.no/svn/psource/Csharpspikes/useSonette
  • Bruk fra vevside: (sammen med latin)
    https://svn.hiof.no/svn/psource/Csharpsites/demosite2
Vedlikehold

B.Stenseth, juni 2006

(Velkommen) Moduler>Webservices>Sonetter (Værobservasjon)