SOAP-grensesnitt
Her følger et enkelt eksempel på hvordan du kan ta i bruk SOAP-grensesnittet i en .Net-basert applikasjon.
Figur 5: Opprett en ny applikasjon
Figur 6: Legg til en ny tjeneste-referanse
Figur 7: Oppgi URL (http://beta-data.udir.no/KL06/soap), trykk "GO" og OK
Endringer i konfigurasjon
I dette tilfellet benytter vi en WCF proxy-klasse for å få tilgang til tjenesten. Denne har en del standard innstillinger, som blant annet går på hvor mange elementer man kan laste ned, og størrelsen på “pakken” fra tjenesten. Grep-tjenesten kan i utgangspunktet gi en oversikt over alle læreplaner, og dette vil overstige standardinnstillingene. For å endre dette – gå til applikasjonens app.config. Der vil du finne noen linjer som ligner på disse:
<basicHttpBinding>
<binding name="GrepSoapBinding_GrepSoap" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None" realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
Her må/bør du endre maxBufferSize og maxReceivedMessageSize til mer enn 65536 tegn, i tillegg til å øke maks antall objekter i en liste. Et forslag på hvordan konfigurasjonen på denne applikasjonen kan se ut er slik:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="GrepSoapBinding_GrepSoap" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="6553600" maxBufferPoolSize="524288" maxReceivedMessageSize="6553600" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None" realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://beta-data.udir.no/soap" binding="basicHttpBinding" behaviorConfiguration="GrepBehavior" bindingConfiguration="GrepSoapBinding_GrepSoap" contract="Læreplanspørringer.GrepSoap" name="GrepSoapBinding_GrepSoap" />
</client>
<behaviors>
<endpointBehaviors>
<behavior name="GrepBehavior">
<dataContractSerializer maxItemsInObjectGraph="2147483647" />
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
Kode
Nå har vi det vi trenger for å kunne bruke tjenestene. Det som gjenstår er litt kode for å faktisk kalle tjenesten.
I eksempelet her vil vi lage en WPF-basert applikasjon for å kunne søke opp læreplaner basert på tittel og gyldig fra-datoen på læreplanen. Vi vil også kunne hente en valgt læreplans vurdering og vise denne.
Først definerer vi brukergrensesnittet (XAMLen).
Her oppretter vi et enkelt stackpanel med en tekstboks for å skrive inn tittel, en datovelger for å velge gyldig fra, en knapp for å starte søk, et grid for å vise søkeresultat (med tittel, kode og gyldig fra som kolonner) og en web-browser for å vise html:
<Window x:Class="TestApplikasjon.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Width="973" Closing="WindowClosing">
<Grid>
<StackPanel>
<Label Content="Tittel å søke på"></Label>
<TextBox Name="txtTittel"></TextBox>
<Label Content="Gyldig Fra å søke på"></Label>
<DatePicker Name="dtpGyldigFra"></DatePicker>
<Button Name="btnSøk" Content="Søk" HorizontalAlignment="Left" Width="40" Click="BtnSøkClick"></Button>
<ScrollViewer MaxHeight="150">
<DataGrid Name="dgSøkeresultat" AutoGenerateColumns="False" SelectionChanged="DgSøkeresultatSelectionChanged">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding tittel}" Header="Tittel"></DataGridTextColumn>
<DataGridTextColumn Binding="{Binding kode}" Header="Kode"></DataGridTextColumn>
<DataGridTextColumn Binding="{Binding gyldigfra}" Header="Gyldig fra"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
</ScrollViewer>
<Label Content="Vurdering" FontWeight="Bold"></Label>
<ScrollViewer MaxHeight="150">
<WebBrowser Name="webBrowser"></WebBrowser>
</ScrollViewer>
</StackPanel>
</Grid>
</Window>
Deretter definerer vi koden for å søke, og for å vise vurdering:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private GrepSoapClient Client { get; set; }
const string HtmlHeadere = @"<html> <head> <meta http-equiv='Content-Type' content='text/html;charset=UTF-8'> </head> <body>";
const string HtmlSluttHeader = @"</body> </html>";
// Kode som kjøres når søk-knappen klikkes
private void BtnSøkClick(object sender, RoutedEventArgs e)
{
InitierProxy();
try
{
// Kjører FinnPlaner-metoden med tittel og gyldig-fra som parametere
dgSøkeresultat.ItemsSource = this.Client.FinnPlaner(
new laereplansoekrequest { gyldigfra = dtpGyldigFra.DisplayDate, tittel = txtTittel.Text }).treff;
}
catch (Exception ex)
{
if (Client.State == CommunicationState.Faulted)
{
this.Client.Abort();
}
MessageBox.Show(ex.ToString());
}
}
private void DgSøkeresultatSelectionChanged(object sender, SelectionChangedEventArgs e)
{
InitierProxy();
try
{
// Finner koden fra det valgte søkeresultatet i Grid'en
var valgtKode = e.AddedItems.Cast<laereplansoekeresultat>().Select(soekeresultat => soekeresultat.kode).FirstOrDefault();
// Henter hele læreplanen fra tjenesten (HentPlanFraKode), og velger ut vurderingen på 'default'-språk (fastsatt språk)
var vurdering = Client.HentPlanFraKode(new hentlaereplanfrakoderequest { Kode = valgtKode }).vurdering.Where(v => v.noekkel == "default").Select(v => v.verdi).FirstOrDefault();
// Viser vurderingen i en browser
if (vurdering != null)
webBrowser.NavigateToString(HtmlHeadere + vurdering + HtmlSluttHeader);
}
catch (Exception ex)
{
if (Client.State == CommunicationState.Faulted)
{
this.Client.Abort();
}
MessageBox.Show(ex.ToString());
}
}
private void InitierProxy()
{
if (Client == null || Client.State == CommunicationState.Faulted)
Client = new GrepSoapClient();
}
private void WindowClosing(object sender, System.ComponentModel.CancelEventArgs e)
{
if (Client != null && Client.State == CommunicationState.Opened)
Client.Close();
}
}
Demonstrasjon
Når vi kjører denne applikasjonen, kan vi filtrere på tittel og gyldig fra. Om vi oppgir “Natur” som tittel og 01.01.2008 som gyldig fra, vil vi få følgende resultat:
Figur 8: Testing av applikasjon