Hej!
Anders Åberg heter jag och jag jobbar på Portal+ i Sundsvall. Jag är ny medlem på SweNug men jag tänkte gå ut hårt med ett blogginlägg direkt :-)

På Portal+ jobbar vi en hel del med utveckling i SharePoint och ett bra sätt att förbättra användarupplevelsen i SharePoint är att använda Silverlight. Tänkbara tillämpningar är t.ex. diagram,Gantt-Scheman, navigering m.m.

I denna guide visar jag hur man gör en Silverlightapplikation som kommunicerar med Sharepoint via web services.
Det här behöver du:

Skapa projekt
Skapa ett nytt projekt i Visual Studio. Välj C# -> Silverlight -> Silverlight Application. Namnsätt t.ex. till MySilverlightApp (så funkar det med exempelkoden nedan)
I dialogrutan som kommer upp väljer du "Automatically generate a test page...". En webbapplikation behövs inte.
Nu har ett projekt skapats och startsidan i applikationen visas, page.xaml.

Lägg till referns till web service
Högerklicka på references i projektet och välj "Add service reference...".
I dialogrutan som visas ska man ange URL till web servicesns WSDL i adressfältet. För Sharepoint-sajter ser den t.ex. ut så här:
http://domän-namn/_vti_bin/lists.asmx?WSDL . Det är alltid Sharepoint-sajtens adress följt av "/_vti_bin/" och sedan kommer asmx-sidan för den web service man vill anropa. I detta fall Lists.asmx. Häng på ?WSDL för att hämta WSDL-specifikationen för tjänsten.

När du angett address så tryck på Go. Då hämtas WSDL dokumentet. Du kan bli promptad för användarnamn och lösenord i detta läge. När WSDL hämtats så namnsätter du referencen och trycker ok.

Av någon anledning får jag alltid ett felmeddelande "This operation is not supported for a relative URI". Jag har ingen aning om vad detta betyder men det verkar inte påverka något så det är inget att bry sig om.

Anropa web service
Nu ska vi anropa en web service i Sharepoint som heter GetListItems. Den används för att hämta data från en Sharepointlista. Det går att ange sökkriterier, sorteringsordning etc. så detta är den tjänst vi huvudsakligen kommer att använda för att hämta data från Sharepoint. Dokumentation för tjänsten finns här .

Öppna Page.xaml.cs.
I konstruktorn lägger du till anrop till en ny metod efter anrop till InitializeComponent().

public Page(){
InitializeComponent();
GetMyItems();
}

Lägg till metoden GetMyItems().

public void GetMyItems()
{
ServiceReference1.ListsSoapClient proxy = new ServiceReference1.ListsSoapClient();

proxy.GetListItemsCompleted += new System.EventHandler<MySilverlightApp.ServiceReference1.GetListItemsCompletedEventArgs>(proxy_GetMyItemsCompleted);

string xmls = @"<?xml version=""1.0""?>
<Document><Query /><ViewFields /><QueryOptions /></Document>";
XDocument doc = XDocument.Parse(xmls);
XElement query = doc.Element("Query");
XElement viewFields = doc.Element("ViewFields");
XElement queryOptions = doc.Element("QueryOptions");

proxy.GetListItemsAsync("MyList", "", query, viewFields, "", queryOptions, "");
}

Jag har valt att kalla servicereferensen för ServiceReference1 i koden ovan, namespace är MySilverlightApp.
Det första som görs är att den proxy som genererats för web servicen instansieras.
Sedan lägger vi till en eventhandler som ska hantera svaret på web service anropet. Web service anrop är alltid asybkrona i Silverlight så därför måste alltid en event handler definieras.

Sedan knåpar vi ihop den XML som GetListItems vill ha som argument. Se http://msdn.microsoft.com/en-us/library/ms953738.aspx för mer information om parametrarna. Nu nöjer vi oss med minsta möjliga så vi kommer att få alla objekt i listan i svaret.

Lägg till en refernce till System.Xml.Linq för att få bort kompileringsfel.

using System.Xml.Linq;

För att exemplet ska fungera måste du skapa en lista som heter MyList i den Sharepoint-sajt du anropar eller byta namnet till en lista som redan finns.

Tips! Om du vill byta adress till Sharepoint-sajten eller helt enkelt anropa en annan sajt så öppnar du ServiceReferences.ClientConfig och byter ut adressen där. Man behöver inte köra Configur Service Reference och generera om proxyn.

Ta emot resultat från web service
För att ta hand om resultatet använder vi Linq to Xml för att tolka reultatet.
Det första vi måste göra är att implementera metoden som tar emot det assynkrona svaret. Enligt koden ovan ska metoden heta proxy_GetMyItemsCompleted.

public void proxy_GetMyItemsCompleted(object sender, MySilverlightApp.ServiceReference1.GetListItemsCompletedEventArgs e)
{
XElement result = e.Result;
var list = from x in result.Elements().First().Elements()
select new Item{
Title = x.Attribute("ows_Title").Value,
ID = x.Attribute("ows_ID").Value
};
ItemList.DataContext = list;
}

När svaret kommer snurrar vi igenom det med Linq och skapar en lista innehållande Item-objekt. Detta är en klass vi själva måste implementera på följande sätt.

public class Item
{
public string Title { get; set; }
public string ID { get; set; }
}

Lägg definitionen direkt i denna klass t.ex. efter proxy_GetMyItemsCompleted.
Det enda som saknas nu är att rendera resultatet. Vi ser i metoden ovan att resultatet kopplas till något som hetet ItemList vilket är en list-komponent i Silverlight som ska visa namnet på ala items.

Rendera resultat
Vi måste modifiera Page.xaml som innehåler xaml för användargränssnittet. Ändra så att den får följande innehåll:

/font>UserControl x:Class="MySilverlightApp.Page"
xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation

xmlns
:x=http://schemas.microsoft.com/winfx/2006/xaml
Width="400" Height
="300">
/font>Grid x:Name="LayoutRoot" Background="White">
/font>ListBox x:Name="ItemList" ItemsSource="{Binding Mode=OneWay}">
/font>ListBox.ItemTemplate>
/font>DataTemplate>
/font>TextBlock Text="{Binding Title}"/>
</DataTemplate
>
</ListBox.ItemTemplate
>
</ListBox
>
</Grid
>
</
UserControl>

Alla Items som hämtas kommer att visas i en ListBox. Vi har sett till att det är Title som visas för varje Item.

Cross-Domain inställningar
För att kunna debugga måste vi konfigurera Sharepoint så att den tillåter anrop till web services från andra domäner. Normalt sett ligger Silverlight-applikationen inbäddad i Sharepoint-sajten och då är det inga problem. När vi ska debugga från Visual Studio så kommer web service anropet inte från samma domän som Sharepoint.

För att tillåta anrop från andra domäner placerar man en s.k. cross-domain fil i webbapplikations rot. OBS! den behöver inte ligga i varje Sharepoint-sajt utan ska endast finnas i roten, alltså i den katalog som finns direkt efter http://<domän-namn>/.

Så här ser crossdomain.xml ut när den tillåter alla anrop.

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "
http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-http-request-headers-from domain="*" headers="*"/>
<allow-access-from domain="*" secure="true"/>
</cross-domain-policy>

Detta är egentligen Flash-varianten men den fungerar med Silverlight. Det finns även en Silverlight variant som heter cilentaccesspolicy.xml. Innehållet där ser lite annorlunda ut.

Debugga
Nu är det klart att debugga. Det första som händer är att det visas en varning att det inte kommer att fungera att anropa web services eftersom vi inte kör Silverlight applikationen från webbservern utan lokalt. Detta meddelande stämmer inte riktigt!
Om vi kör mot en Sharepointsajt och använder http (ej https) så kommer det att fungera. Om vi anropar web services med https så kommer vi att få felmeddelande om cross-domain problem vid anropet. Då går det tyvärr inte att debugga.

Tryck Yes och fortsätt. Vid web service anropet så kommer inloggningsruta för Sharepoint-sajten att visas. Mata in uppgifter och fortsätt så ska innehållet i vår lista visas i Silverlightapplikationen.

För att kunna debugga Silverlightapplikationer som anropar web services via https så kan man driftsätta applikationen i Sharepoint-sajten och köra den därifrån i en webbläsare. Sedan gör man "Attach to process" i Visual Studio.

Installera i Sharepoint
Gör en ny aspx-sida t.ex. i Sharepoint Designer med följande innehåll:

<%@ Page masterpagefile="~masterurl/default.master" language="C#" title="Untitled 1" inherits="Microsoft.SharePoint.WebPartPages.WebPartPage, Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" meta:progid="SharePoint.WebPartPage.Document" %>

<asp:Content id="Content1" runat="server" contentplaceholderid="PlaceHolderMain">
<object data="data:application/x-silverlight," type="application/x-silverlight-2" width="100%" height="100%">
<param name="source" value="./MySilverlightApp.xap"/>
<param name="onerror" value="onSilverlightError" />
<param name="background" value="white" />
</object>

</asp:Content>

Ladda upp Silverlightapplikationen till Sharepoint med Sharepoint Designer eller ladda upp den till ett dokumentbibliotek. Applikationen är filen MySilverlightApp.xap och den finns under projektets bin-katalog...

Istället för att göra en aspx-sida kan man lägga in en Content-Editor Web Part i en sida och stoppa in följande kod:

<object data="data:application/x-silverlight," type="application/x-silverlight-2" width="100%" height="100%">
<param name="source" value="./SilverlightSP.xap"/>
<param name="onerror" value="onSilverlightError" />
<param name="background" value="white" />
</object>

Det var allt. Kommentera gärna vad ni tycker om mitt inlägg eller om ni har egna erfarenheter av Silverlight tillsammans med SharePoint. Tycker ni att det var bra så har jag säkert mer tips att dela med mig av.

Ha det bra!
Anders

Visningar: 92

Kommentera

Du måste vara medlem i SweNug för att lägga till kommentarer!

Gå med i SweNug

Kommentar av Jens Pettersson den 24 Mars 2009 kl. 9.54
Bra tips! Har länge velat labba med Silverlight i SharePoint men inte haft... hm... tid (det är en bra bortförklaring!).

//J
Kommentar av Stefan E den 24 Mars 2009 kl. 6.32
Ja sånt här är jättekul verkligen, bra tips!
Kommentar av Gustaf Lindqvist den 23 Mars 2009 kl. 23.31
Wow, det här var intressant läsning och bra start för bloggen!

© 2018   Created by Jarle Skogheim.   Drivs med tekniken bakom

Emblem  |  Rapportera en händelse  |  Användarvillkor