Reportviewer: The report definition is not valid. Details: Data at the root level is invalid. Line 1, position 1.

20. Januar 2010

Nach dem Deployen (Web Deployment Project) von lokalen rdlc Reports aus Visual Studio 2008 heraus, gab es auf dem IIS folgenden Fehler:

[ReportProcessingException: The report definition is not valid.  
Details: Data at the root level is invalid. Line 1, position 1.]

[DefinitionInvalidException: The definition of the report
'Main Report' is invalid.]

 

Das Problem ist, dass die Reports vorkompliliert werden, was leider kontraproduktiv ist. Durch ergänzen der csproj Datei für das Deploy kann der Fehler umgangen werden:

<Target Name="AfterBuild">
  <Delete Files="$(OutputPath)\Reports\Report.rdlc" />
  <Copy SourceFiles="$(SolutionDir)WebSites\MyWebApp\Reports\Report.rdlc" 
        DestinationFolder="$(OutputPath)\Reports" />
< /Target>

 

.NET, ASP.NET

Windows Mobile

19. April 2009

Ich bin ja kein Freund von Windows Mobile. Meine Erfahrungen waren einfach zu negativ. Eine Benutzerführung, die nicht an den Anwendungsfall (nämlich mobiler Geräte) angepasst ist, und zudem noch ein Hardwaredesign, das jedem Hersteller es erlaubt hat alles zu verschlimmbessern. Nach 3 Geräten mit unterschiedlichen Windows Mobile Versionen habe ich jedenfalls genug von den sogenannten PDAs. Es ist mir zumindest eine Freude zu sehen, wie Apple mit dem iPhone den Markt von hinten aufrollt, und ein Gerät entwickelt hat, das in Design und Funktion Maßstäbe setzt.

Wie dem auch sei. Neulich stand bei uns um die Ecke ein "Windows Mobile" Auto. Irgendwie musste ich ziemlich lachen, denn der Mini Laster spiegelt meine negativen Erfahrungen ziemlich exakt wieder: Altes Design, alte Technologie und weder Fisch noch Fleisch.

Hoffentlich wird Windows Mobile 7 (oder schon 6.5) mal ein Schritt in die richtige Richtung und folgt einer zeitgemäßem Benutzerführung. Dann werde ich auch wieder einen ernsthaften Blick auf das .NET Compact Framework werfen - das hingegen ziemlich genial ist.

 

.NET

ASP.NET Performance von Visual Studio steigern

16. April 2009

Visual Studio verlangt nach schnellen Festplatten. Je schneller, desto besser. Nichts ist allerdings so schnell wie eine RamDisk. Wer glaubt, dass die RamDisk eine Sache aus der alten DOS-Zeit ist, der irrt. Speicher ist billig und 64 Bit Betriebssysteme sind auch schon fast Mainstream (na ja, noch nicht so ganz).

Was liegt also näher, die brach liegenden Megabytes des RAMs als RamDisk zu nutzen. Unter Vista x64 nutze ich die RAMdrive von QSoft, welche sich recht komfortabel über den Gerätemanager einstellen lässt. Zur Zeit nutze ich 1GB als Laufwerksgröße.

Damit nun ASP.NET Projekte diese RamDisk nutzen können, muß in der machine.config das tempDirectory angepasst werden:

<compilation tempDirectory="R:\Temp\aspnet"/>


Details zu diesem Eintrag findet sich bei MSDN.

Weiterhin lassen sich auch das Cache-Verzeichnis vom FireFox oder IE auf die RamDisk legen, um die Performance zu steigern.

.NET, ASP.NET

Visual Studio 2008 und Reporting Services

13. März 2008
Nach dem offiziellen Launch von Visual Studio 2008, habe ich mich auch entschlossen alle aktuellen Projekte nach VS 2008 zu portieren. Versprochen wird ja, dass man nun für .NET 2.0, 3.0 und 3.5 entwickeln kann und dabei lediglich die Solution-Datei unterschiedlich ist (warum auch immer).

Tatsächlich ließen sich die Projekte recht einfach nach VS 2008 portieren: Im Migrationsassistenten tauchten keine Fehler auf ;-) Aber: Die Reporting Services von SQL Server 2005 werden nicht unterstützt! Man kann also diese Projekte nicht in VS 2008 bearbeiten! Somit ist man also immer noch auf VS 2005 angewiesen.

Verstehen kann ich das allerdings nicht, denn VS 2008 lockt ja gerade damit eine Plattform für alle .NET Versionen zu sein. Ausgerechnet bei den Reporting Services leistet sich Microsoft einen nicht nachvollziehbaren Schnitzer...

.NET

Nachtrag zum .NET Usergroup Treffen in HH vom 5.12.2007

6. Dezember 2007

Gestern haben wir uns beim .NET Usergroup Treffen in Hamburg mal wieder der Workflow Foundation gewidmet. Diesmal stand die Praxis im Vordergrund anhand eines Beispiels zur Genehmigung einer Reisekostenabrechnung. Das fertige Beispiel habe ich als Download angefügt.

Hier noch die Infos, die ich nachreichen möchte:

Expense Demo von Microsoft (WF mit WCF Integration)

Buchempfehlung Windows Workflow Foundation (1-904811-21-3)

Reisekosten.zip (16,5 KB)

.NET, Veranstaltungen

.NET Assemblys in Excel verwenden

28. September 2007

.NET Assemblies in VBA, sprich Excel oder Access zu verwenden hat einen gewissen Charme. Komplexe Businesslogik lässt sich dann an einer Stelle pflegen und verwenden.

Unter http://dsmyth.blogspot.com/2006/03/calling-managed-code-from-vba-using.html gibt es gute Hintergrundinfos, wie ein 'Hello World' zustande kommt. Allerdings bin ich dabei auf Probleme gestossen. Denn wenn man mit Visual Studio 2005 unter .NET 2.0 entwickelt und versucht das mit Excel XP aka Excel 2002 aka Excel 10.0 zum Laufen zu bekommen, erscheint lediglich ein Automatisierungsfehler beim Aufruf der Assembly unter Excel. Dieser Fehler rührt daher, dass Excel 10.0 als Standard die .NET 1.1 Runtime verwendet. Abhilfe ist eine Excel.EXE.config Datei im Installationsverzeichnis von Excel mit folgendem Inhalt:



<configuration>
  <startup>
    <supportedRuntime version="v2.0.50727" />
  </startup>
</configuration>


Allerdings hat man dann Excel 10.0 komplett auf .NET 2.0 umgestellt. Das kann also noch andere Auswirkungen nach sich ziehen.

Was weiterhin im oben erwähnten Artikel nicht erwähnt wurde, ist das setzen von [assembly: ComVisible(true)]in der AssemblyInfo.cs.

 

.NET

Kommunikation mit UserControls über eine MasterPage in ASP.NET

4. April 2007
Die in ASP.NET 2.0 eingeführte MasterPage erfreut sich zunehmender Beliebtheit. Denn mittels dieser lassen sich Elemente, die auf allen Seiten einer Anwendung gleich sein sollen, einmalig erstellen und verwenden. Damit ist die MasterPage ein Pflichtelement für jede ASP.NET Webanwendung.
Nun stellt sich aber die Frage, wie Controls, die in der MasterPage liegen mit anderen Controls bzw. UserControls auf der jeweiligen Seite (bzw. im ContentPlaceHolder) kommunizieren sollen? Die MasterPage weiss ja noch gar nicht, welche Controls in der Seite enthalten sind. Eine mögliche Lösung möchte ich hier skizzieren:
Bei diesem Beispiel enthält die MasterPage einen Button und eine TextBox. Sobald auf den Button geklickt wird, soll der Text an die UserControls geschickt werden, die sich für diesen Text interessieren. Das Interesse an einem Text lässt sich recht gut über ein Interface definieren:

public interface ITextConsumer
{
    void HandleTextEvent(object sender, TextEventArgs e);
}


Die Nutzinformation, also der Text wird mittels eines Event Arguments übermittelt:

public class TextEventArgs : EventArgs
{
    private string text;

    public string Text
    {
        get { return text; }
        set { text = value; }
    }
}


Die UserControls, die sich nun für den Text interessieren müssen einfach das Interface ITextCosumer implementieren:

public partial class WebControls_DataControl : System.Web.UI.UserControl, ITextConsumer
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }

    #region ITextConsumer Member
    public void HandleTextEvent(object sender, TextEventArgs e)
    {
        ' Process the Text. E.g. search in the database etc.
    }
    #endregion
}


In der MasterPage muss nun im Click Ereignis des Buttons die Controls Collections des ContentPlaceHolders durchlaufen werden. Dabei wird jedes Controls auf das Interface ITextCosnumer gecastet. Klappt der Cast, wird der Text über die im Interface definierten Methode übermittelt.

protected void Button1_Click(object sender, EventArgs e)
{
    TextEventArgs text = new TextEventArgs();
    text.Text = this.TextBox1.Text;
       
    foreach (Control cntl in this.ContentPlaceHolder1.Controls)
    {
        ITextConsumer eventConsumer = cntl as ITextConsumer;
        if (eventConsumer != null)
        {
            eventConsumer.HandleTextEvent(this.Page, text);
        }
    }
}


Das war's! Diese Lösung funktionert recht gut mit direkt in den Seiten implementierten UserControls. Enthalten die UserControls selbst noch weitere Controls, die sich für den Text interessieren, muss diese Information evtl. weitergereicht werden (hier auch wieder die Controls Collection durchlaufen).


Development, .NET, ASP.NET

Nachtrag zum .NET Usergroup Treffen in HH

9. Februar 2007
Hier ein kleiner Nachtrag zum .NET Usergroup Treffen in Hamburg, das jeden ersten Mittwoch im Montag im Irish Pub im Fischhafen stattfindet:

Thema war die Windows Workflow Foundation (WF), welche Bestandteil von .NET 3.0 ist. Da das Thema sich nicht gleich vollständig bei einem Gläschen Bier erschließt, hier einige Links, die weiterführende Infos enthalten:

  1. Die Powerpoint Folien zum Vortrag von Sebastian Weber gibt es hier.
  2. Super kleine Webcasts zum Thema WF gibt es unter wf.netfx3.com. Einfach unter Samples/Information/Screencasts die entsprechenden Dateien runterladen. Jeder Webcast dauert zwischen 10 und 15 Minuten und führt ideal in die Windows Workflow Foundation ein.
  3. Das Windows SDK for Vista and .NET 3.0 enthält viele Samples und die Dokumentation zu WF.
  4. Zur Entwicklung von Workflows braucht man den graphischen Designer als Visual Studio Extension.

Viel Spaß in der neuen Welt der Workflows!

Übrigens, beim nächsten Usertreffen am 7.3.2007 werden wir nochmals das Thema Workflow Foundation behandeln. Vielleicht bringen ja mal einige Sharepoint Entwickler Ihr Notebook mit und erzählen von Ihren Erfahrungen...

Development, .NET, Veranstaltungen, Vista

Howto: Verwenden von log4net in ASP.NET Webanwendungen

7. Februar 2007

Hier ein Kurzleitfaden, um log4net in ASP.NET Webanwendungen zu verwenden:

1. Einträge in der Web.config vornehmen:



<configSections>
  <section name="log4net"
      type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>

<log4net>
  <root>
    <level value="DEBUG"/>
    <appender-ref ref="FileAppender"/>
  </root>
  <appender name="FileAppender" type="log4net.Appender.FileAppender">
    <file value="log/log-file.txt"/>
    <appendToFile value="true"/>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%d{dd.MM.yy HH:mm:ss} %-5p %c %m%n"/>
    </layout>
  </appender>
</log4net>

2. In der Global.cs (Global.asax) im Application_Start Event log4net initialisieren:



log4net.config.xmlconfigurator.configure()

3. Verwenden des Loggers durch eine statische Variable in jeder Klasse:



private static readonly ILog log = LogManager.GetLogger(typeof(Classname));

4. Anschliessend kann der Logger in der Klasse verwendet werden:



log.Debug(string.Format("LogMeldung {0}", varname))

.NET, ASP.NET

.NET 3.0 ist da!

8. November 2006
Nach vielen CTP's und 2 Betas ist die Version Nummer 3 des .NET Frameworks released worden. Allerdings hat sich bei den bestehenden .NET Komponenten nichts geändert, sondern es sind lediglich neue aber sehr interessante Komponenten hinzugekommen:
  • Windows Presentation Foundation
  • Windows Communication Foundation
  • Windows Workflow Foundation
Insofern wäre die Versionsnummer 2.5 für das Framework eigentlich eher angebracht gewesen, denn bei den Sprachelementen bleibt alles wie gehabt.

Mehr Infos und Links zum Download

Development, .NET