Freitag, 10. Oktober 2008

spdisco.aspx von anderem Prozess im Zugriff??!

Kürzlich habe ich für einen eigenen Webservice eine Solution geschrieben. Die Solution sollte auch die spdisco.aspx im /ISAPI Verzeichnis anpassen, damit Dienstebeschreibungen für den Webservice gleich mitgeliefert werden. Da es sich um eine .aspx Datei handelt, konnte ich leider nicht per System.Xml darauf zugreifen, sondern musste den guten alten StreamReader /-Writer verwenden.

Beim Speichern der neuen Version bekam ich aber unregelmäßig die Exception, ein anderer Prozess greife auf diese Datei zu. Obwohl mein eigener Code es definitiv nicht war. In diesem Fall blieb mir nichst anderes übrig als die Datei als .txt zu speichern und händisch umzubenennen.

Welche Prozess greift den grundsätzlich auf diese Datei zu, mit Ausnahme des IIS, wenn er grad den Cache neu aufbaut??

Farmdeploy mit SPJobdefinition

Alle bisherigen Solutions wurden immer nur auf einem Frontend deployed. Bei diesem Projekt war es jedoch eine Anforderung, die Lösung auf allen Frontends (4 Stück) der Farm einzurichten bzw. auch wieder zurückzuziehen.

Es gab daher nur den Weg über eine SPJobDefinition, da dieser über mehrere Farmmember synchroniziert werden.

Der Umgang mit dieser Klasse war eine gute Erfahrung für mich, denn in Zukunft wird es viele Anwendungsfälle geben, in denen ich auf dieses Wissen zurückgreifen kann. Warm-Ups, BDC-Deployment, Design-Anapssungen, usw.

Gruß Nils

Mittwoch, 8. Oktober 2008

Erstes Treffen der ISPA SharePoint User Group Nürnberg

Vgl. Consultants Digest

Wie mein Kollege Ricky schon in der SharePoint Box geschrieben hat, hat am letzten Donnerstag das erste Treffen der regionale User Gruppe Nürnberg bei der Spirit Link GmbH stattgefunden.

Zu meiner großen Freude sind ca. 90% der Personen, die zugesagt hatten auch erschienen. So hatten wir eine sehr angenehme Mischung aus interessierten Endanwendern, Sharepoint Dienstleistern und Trainern vor Ort. Schon zu Begin der Veranstaltung bei Kaffee und Brötchen wurde intensiv über verschiedenste Themen gesprochen.

Nachdem ich mich nach ca. einer halben Stunde genötigt sah, dem regen Treiben ein Ende zu setzen, sind wir nach einer kurzen Einleitung, inklusive eines Begrüßungsvideos von Michael Greth und Daniel Wessels zu dem thematischen Hauptschwerpunkt des Abend übergegangen. Aus meinem Vortrag unter dem Titel "Hands on Experiences zum Einsatz von Nintex Workflow 2007" ist glücklicherweise schnell eine rege Diskussion zum Thema Workflows, Livelink sowie Möglichkeiten und Grenzen von SharePoint geworden.

Im Anschluss an den Vortrag sind die meisten Teilnehmer noch in angenehmer Atmosphäre geblieben, um das eine oder andere mehr oder weniger SharePoint relevante Thema zu besprechen und interessante Kontakte zu knüpfen.

Alle Teilnehmer haben Interesse an weitern solcher Termine bekundet, was mich als Ausrichter natürlich besonders glücklich macht, da es für einen gelungenen Auftakt spricht. An dieser Stelle möchte ich mich auch bei unsere Verwaltung bedanken für Ihre Hilfe bei der Vorbereitung danken. Nur durch sie konnte das Event so gut und reibungslos gelingen.

Der nächste Termin soll in den nächsten sechs bis acht Wochen stattfinden. Als erneuten Austragungsort haben wir uns auf die Spirit Link GmbH geeinigt, allerdings sollen weitere Treffen bei Möglichkeit auch bei anderen Teilnehmern stattfinden.

Weiter Informationen zu den Terminen kann man auch bei der extra eingerichteten XING Gruppe zur regionale SharePoint User Gruppe Nürnberg erfahren.

Dienstag, 7. Oktober 2008

Listeninstanzen in Solutions vorbefüllen

Bisher haben wir Listen, die per Solutions installiert werden und von Haus aus über Werte verfügen sollten mit Hilfe von FeatureReceivern befüllt. Da es sich dabei um eine Vielzahl von Listen mit mehreren Spalten handelte, bot es sich an, das ganze über eine Befüll-Methode abzuarbeiten, die ihre Daten aus den entsprechenden Settings-Dateien beziehen.

Nun arbeite ich aktuell aber an einem sehr kleinen Projekt welches derartigen Aufwand nicht gerechtfertigt: im Rootweb wird eine Liste mit vier einzelnen Einträgen benötigt, die sich nicht mehr ändern werden.

Diese Werte werden nun einer ListInstance mitgegeben:


<?xml version="1.0" encoding="utf-8" ?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<!-- PicklistRole -->
<ListInstance FeatureId="39fba828-57af-4c1f-ba42-19cc13e8ad99"
TemplateType="100"
Id="PicklistRoleList"
Title="$Resources:root_lists,picklistRoleInstanceTitle;"
Description="$Resources:root_lists,picklistRoleInstanceDescription;"
OnQuickLaunch="FALSE"
Url="$Resources:core,lists_Folder;/Picklist Rolle">
<Data>
<Rows>
<Row>
<Field Name="Title">Projektmanager</Field>
</Row>
<Row>
<Field Name="Title">Technischer Leiter</Field>
</Row>
<Row>
<Field Name="Title">Entwickler</Field>
</Row>
<Row>
<Field Name="Title">Projektassistenz</Field>
</Row>
</Rows>
</Data>
</ListInstance>
</Elements>


Diese ListInstance wird im Feature eingebunden welches dann über die WebFeatures-Sektion der onet.xml aktiviert wird und daraufhin die Liste mitsamt den Einträgen bereitstellt:

Montag, 6. Oktober 2008

WebTemplates löschen

Mir stellte sich folgender Anwendungsfall: Unterhalb einer SiteCollection sollen eigene SubWebs erstellt werden können; unterhalb dieser jedoch keine weiteren also ausschließlich Websites eine Ebene unterhalb der SiteCollection.

Programmatisch löste ich das ganze mit Hilfe eines FeatureReceivers, dessen Feature (Web-Scope) in der onet.xml aktiviert wird:

public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
// remove all site templates to prevent, users create more subwebs beneath the current one
if (properties.Feature.Parent is SPWeb)
{
try
{
using (SPWeb currentWeb = (SPWeb)properties.Feature.Parent)
{
currentWeb.SetAvailableWebTemplates(new Collection(), (uint)1031);
currentWeb.Update();
}
}
catch (Exception e)
{
}
}
}

In dem obigen Codebeispiel werden die verfügbaren WebTemplates des aktuellen Webs einfach neu gesetzt und zwar mit einer leeren Collection des Typs SPWebTemplate. Anschließend wird das Web geupdated damit die Änderung wirksam wird. Die 1031 steht hier übrigens für den deutschen Sprachraum.

Wiederherstellen lassen sich die Standard-Templates natürlich auch mit Hilfe dieser zwei Zeilen:

currentWeb.AllowAllWebTemplates();
currentWeb.Update();