SP324098: Your browser could not complete the operation

After having changed the password of my Visual Studio Online account, Visual Studio greeted me by asking to reenter my credentials. So I clicked on the Sign In button but instead of being redirected to the Sign In page I simply got the error message "SP324098: Your browser could not complete the operation".

Visual Studio Error Dialog

I tried several things like setting IE to be my default browser, deleting the browser history, and resetting IE to factory settings. I also installed the most recent version of Newtonsofts Json library to my GAC without having success on the Sing In page.

Finally, I found the answer on Stackoverflow.
My computer is joined to a domain network but I tried to do the sign in from home without a VPN connection established. The Visual Studio Identity provider thus could not reach my domain controller and gave the cryptic error message instead of the Sign In page.

The solution was quite simple: Establish a VPN connection such that Visual Studio can reach the domain controller and everything is fine again.

Visual Studio Login Dialog

Delete Team Projects from Hosted TFS Servies

When the TFS Services preview went live, I started moving my on premise projects to the hosted tfs services.

At some point I wanted to delete a team project created in the hosted services. For now, the web interface does not provide an option for that. However, the commandline tool tfsdeleteproject works fine.

Syntax:

tfsdeleteproject /force /collection:https://[yourname].visualstudio.com/DefaultCollection [yourproject]

Warning: This operation cannot be undone!

WebDay - Part II (02. Juli 2010)

Agenda
10:00-11:20        WCF & Silverlight
11:40-13:00        Sql Server

Fortsetzung mit Microsoft Surface am 16. Juli 2010 um 10:00

Ressourcen
WCF Developer Center
Sql Server Developer Center

Material
WCF Slides
http://www.janmolnar.de/uni/download.aspx?f=stuff/WebDay-Wcf.pdf

Sql Server Slides
http://www.janmolnar.de/uni/download.aspx?f=stuff/WebDay-SqlServer.pdf

CanAddNew und generische Listen mehrerer Parameter

Das WPF ListCollectionView unterstützt das Hinzufügen von Elementen bei generischen Listen in einem Parameter, wie List<T> oder ObservableCollection<T>.

Erstellt man jedoch ein View zu einer Collection der Bauart MyCollection<T,S>, unterstützt ListCollectionView lediglich ReadOnly Operationen, denn CanAddNew evaluiert zu “False”. Nach einigen Nachforschungen stellt man fest, dass CanCunstructItem zu “False” evaluiert und folglich auch CanAddNew.

Man folgendem dirty code lässt sich das Problem umgehen. In der Implementierung von ListCollectionView in .NET 4 tritt das Problem nicht auf.

public class TypedListCollectionView : ListCollectionView
    {
        public TypedListCollectionView(IList items, Type itemType)
            : base(items) {

            var itemConstructor = itemType.GetConstructor(Type.EmptyTypes);

            Type type = typeof(ListCollectionView);

            var itemConstructorField =
            type.GetField("_itemConstructor", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
            var isItemConstructorValidField =
            type.GetField("_isItemConstructorValid", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);

            itemConstructorField.SetValue(this, itemConstructor);
            isItemConstructorValidField.SetValue(this, true);
        }
    }

WebDay – Part I (18. Juni 2010)

In einem Tag zum .NET Webentwickler. Wir zeigen dir alles was du brauchst, von ASP.NET und Silverlight über WCF WebServices bis hin zur Datenbank Sql Server 2008.

Agenda
10:00-11:20        Einführung in ASP .NET
11:40-13:00        Silverlight

Fortsetzung mit WCF WebServices und Sql Server am 02. Juli 2010 um 10:00

Ressourcen

http://www.asp.net – ASP.NET HowTo Videos, Tutorials, uvm.
http://ajax.asp.net – Ajax Control Kit

Material
Slides
http://www.janmolnar.de/uni/download.aspx?f=stuff/ASP.NET-Slides.pdf

Sourcen
http://www.janmolnar.de/uni/download.aspx?f=stuff/ASP.NET-Sourcen.zip

Sql Database nach Sql Azure migrieren

1. Datenbank einrichten

Die Dantebank erstellt man über das WebInterface zu finden auf http://windows.azure.com.

image

Anschließend muss die Firewall so konfiguriert werden, dass man vom lokalen Computer Zugriff auf die Datenbank hat. Soll die Sql Azure Datenbank außerdem von einem Windows Azure Service verwendet werden, dann muss auch “Allow Microsoft Services” aktiviert werden.

image

1. Sql Server 2008 R2 CTP

Um bequem auf die Sql Azure Datenbanken zuzugreifen ist Sql Server 2008 R2 nötig, das Management Studio der “normalen” 2008er Version hat leider keinen Zugriff.

Die CTP steht hier zum Download (kostenlos)

http://www.microsoft.com/sqlserver/2008/en/us/R2Downloads.aspx

2. Datenbank Skripte generieren

Der einfachste Weg, die lokale Datenbank mit oder ohne Daten in die Cloud zu bekommen ist mittels Sql Skripten. Sql 2008 R2 bringt dazu auch gleich die nötigen Wizards mit. Einfach die Datenbank auswählen –> Tasks –> Generate Scripts. Dann im Wizard Sql Azure auswählen. Das ist wichtig, da Sql Azure nicht alle Befehle des Sql Servers 2008 unterstützt, der Wizard generiert dann automatisch “bereinigte” Skripte.

image image

Ich empfehle zunächst ein Skript für das Schema zu erstellen (Schema only) und dieses auszuführen. Ging alles glatt, kann man anschließend die Daten hinterherschicken (mittels Data only Skript).

Verwendet man eine ASP.NET 3.5 Membership Datenbank ist ein kleiner Fix bei den Stored Procedures notwendig. Ich habe folgenden verwendet (ohne Gewähr)

CREATE PROCEDURE [aspnet_Membership_GetNumberOfUsersOnline]
    @ApplicationName [nvarchar](256),
    @MinutesSinceLastInActive [int],
    @CurrentTimeUtc [datetime]
WITH EXECUTE AS CALLER
AS
BEGIN
    DECLARE @DateActive datetime
    SELECT  @DateActive = DATEADD(minute,  -(@MinutesSinceLastInActive), @CurrentTimeUtc)

    DECLARE @NumOnline int
    SELECT  @NumOnline = COUNT(*)
    FROM    dbo.aspnet_Users u,
            dbo.aspnet_Applications a,
            dbo.aspnet_Membership m
    WHERE   u.ApplicationId = a.ApplicationId                  AND
            LastActivityDate > @DateActive                     AND
            a.LoweredApplicationName = LOWER(@ApplicationName) AND
            u.UserId = m.UserId
    RETURN(@NumOnline)
END

3. User anlegen

Nachdem die Datenbankstruktur samt Daten nun in der Cloud sind, wollen wir wieder darauf zugreifen.


Dazu mit dem Management Studio in die master Datenbank von Sql Azure einloggen und einen login erstellen.

CREATE LOGIN MyCloudUser WITH PASSWORD = 'Password';

Anschließend muss der login auf einen Datenbankuser gemapped werden. Dazu loggt man sich wieder in der Sql Azure Datenbank ein und führt folgenden Befehl aus.

CREATE USER MyCloudUser FOR LOGIN MyCloudUser;
Die Rechteverwaltung in Sql Azure ist analog zu der im Sql Server. Für die meisten Anwendungen genügen Lese- und Schreibrechte, diese kann man so vergeben.
EXEC sp_addrolemember N'db_datareader', N'MyCloudUser'
EXEC sp_addrolemember N'db_datawriter', N'MyCloudUser'

Sind außerdem Stored Procedures im Spiel, will man auch auf diese den Zugriff erlauben. Will man gleich alle Stored Procedures auf einmal freischalten, empfielht sich die Erstellung einer Rolle und mit den entsprechenden Rechten.

CREATE ROLE db_executor
GRANT EXECUTE TO db_executor

Nun müssen lediglich alle Benutzer, die alle Stored Procedures ausführen dürfen sollen zu dieser Rolle hinzugefügt werden

EXEC sp_addrolemember N'db_executor', N'MyCloudUser'
!! Nur wenn es absolut unabdingbar ist, sollten dem Anwendungsbenutzer auch dbo-Rechte verliehen werden!!

-- only if you need dbo access:
EXEC sp_addrolemember N'db_owner', N'MyCloudUser'

4. Anwendung testen

Jetzt ist die Sql Azure Datenbank bereit für den ersten Anwendungszugriff.

Hinweis: Damit Sql Azure Zugriff gewähren kann, muss aus dem connectionstring der ServerName servername.database.windows.net ausgelesen werden. Viele Provider senden, diesen jedoch nicht, daher sollte der Benutzername im Format user@server angegeben werden.

AjaxMin – JavaScript und CSS Dateien automatisch schrumpfen

Während der Entwicklung von Web-Anwendungen ist man meist über gut dokumentierte JavaScripts und CSS Stylesheets, die viel Whitespace zur Strukturierung enthalten, dankbar. Geht es jedoch ans Deployment, möchte man diese Dateien möglichst klein halten, um den Seitenaufbau im Browser zu beschleunigen. Im Web findet man zahlreiche Tools sogenannte “Minifier”, die die Dateien verkleinern, indem Kommentare und Whitespace entfernt werden. In großen Projekten mit vielen Skripts und Styles ist dieser Vorgang jedoch sehr mühsam und nach jeder Änderung müssen die Dateien neu “minifiziert” werden.

Abhilfe schaft “AjaxMin” eine Visual Studio Erweiterung von Microsoft, die diese Arbeit automatisch durchführt. AjaxMin definiert einen Build-Taks, der sich in jedes Projekt einbinden lässt und bei jedem Compile-Vorgang automatisch alle Skripte und Style minifiziert und mit der Endung “min.js” bzw. “min.cs” neben die bestehenden Dateien legt. Damit reduziert sich der Aufwand für die Minifizierung auf Null :)

Übersicht über AjaxMin

Download von AjaxMin

Ankh über Proxy Server

Surft man über einen Proxy Server und will auf seine SVN Repositories über Ankh zugreifen, genügen die globalen Einstellungen des InternetExplorers nicht.

Dennoch verfügt Ankh über die Möglichkeit einen Proxy Server zu verwenden. Dazu muss die folgende Datei editiert werden:

%APPDATA%\Subversion\servers

Dazu müssen die Elemente http-proxy-host usw. auskommentiert werden.

http-proxy-host = your-proxy.com
http-proxy-port = 80

Windows 7 RTM ab dem 13. August in der MSDN AA

Ich habe soeben folgende Nachricht erhalten:

Wir freuen uns Ihnen mitteilen zu können, dass “Windows 7 Professional ” ab dem 13. August 2009 in ELMS erhältlich ist.

  • Windows 7 Professional (32 bit ) and (64 bit )
  • Microsoft CCR and DSS Toolkit 2008 R2
  • Microsoft Robotics Developer Studio 2008 R2
  • Expression Studio 3
  • Surface SDK

(Bitte beachten Sie: “Windows 7 Professional” ist nur in englisch erhältlich)

Uni Karlsruhe: WPF Vortrag

Hier gibt es die Slides, Sourcen und Aufgaben zum WPF Vortrag vom 19.06.2009.

Sildes+Sourcen
http://janmolnar.de/msp/wpfkarlsruhe/WpfWorkshop.zip

Aufgaben
http://janmolnar.de/msp/wpfkarlsruhe/aufgaben2.pdf

 

Zum Weiterlesen

WPF DataBinding Blog
http://bea.stollnitz.com/blog/

WPF Toolkit
http://wpf.codeplex.com/

KaXaml
http://www.kaxaml.com/

Family Show
http://www.vertigo.com/familyshow.aspx

Das wahre Office kommt…

Kommende Woche - am 8. April!

Download: www.daswahreoffice.de

clip_image001

Uni Stuttgart: WPF Vortrag

Hier gibt es die Slides, Sourcen und Aufgaben zum WPF Vortrag vom 25.03.2009.

Slides + Sourcen
http://vb-magazin.de/janm/WPF-Vortrag.zip

Aufgaben
http://vb-magazin.de/janm/Aufgaben.pdf

Zum Weiterlesen

WPF DataBinding Blog
http://bea.stollnitz.com/blog/

Family Show
http://www.vertigo.com/familyshow.aspx

WPF Toolkit
http://wpf.codeplex.com/

KaXaml
http://www.kaxaml.com/

Posted von Jan-Cornelius Molnar mit no comments
Abgelegt unter: , ,

Web Platfrom Installer geht in die zweite Runde

Auf der MIX wurde die Beta der Version 2 des Web Platform Installers angekündigt. Das Tool übernimmt die Installation des .NET Frameworks, IIS mit Erweiterungen, Sql Server Express und Visual Web Developer und kann einem damit viele Stunden Arbeit beim Aufsetzen einer Entwicklungs oder sogar Produktivumgebung sparen und das alles in einem 1MB Download.

Natürlich lässt sich jede Komponente einzeln auswählen und konfigurieren.

In Version 2 ist außerdem noch die Installation von beliebten Anwendungen wie DotNetNuke und WordPress möglich, sowie die Bereitstellung der neusten PHP Version als PHP für Windows!

Das Tool unterstützt Windows XP SP2+, Windows Vista SP1, Windows Server 2003 SP1+ und Windows Server 2008.

Download
http://www.microsoft.com/web/downloads/platform.aspx

Sql Server ExceptionMessageBox in WPF nutzen

Wer das Microsoft Sql Management Studio verwendet kennt sie vielleicht, die ExceptionMessageBox des Sql Servers. Sie bietet eine gute Übersicht über alle relevanten Informationen einer Exception und das Beste ist, dass sie als Assembly in jedes .NET Projekt eingebunden und damit in jeder .NET Anwendung angezeigt werden kann.

image

Einziger Haken: Zur Anzeige der ExceptionMessageBox wird ein owner vom Typ System.Windows.Forms.IWin32Owner erwartet. Bewegt man sich in WPF, steht dieser einem natürlich nicht zur Verfügung. Abhilfe schafft der Typ ExceptionMessageBoxParent, da dieser mit einem gewöhnlichen Handle erstellt werden und somit als IWin32Owner verwendet werden kann.

Mit den WPF Interop Tools kann somit die ExceptionMessageBox problemlos in WPF einbinden.

   1:      public class ExceptionMessageBoxWpf : ExceptionMessageBox
   2:      {
   3:          public ExceptionMessageBoxWpf() : base() { }
   4:          public ExceptionMessageBoxWpf(Exception exception) : base(exception) { }
   5:          public ExceptionMessageBoxWpf(string text) : base(text) { }
   6:          public ExceptionMessageBoxWpf(Exception exception, ExceptionMessageBoxButtons buttons) : base(exception, buttons) { }
   7:          public ExceptionMessageBoxWpf(string text, string caption) : base(text, caption) { }
   8:          public ExceptionMessageBoxWpf(Exception exception, ExceptionMessageBoxButtons buttons, ExceptionMessageBoxSymbol symbol) : base(exception, buttons, symbol) { }
   9:          public ExceptionMessageBoxWpf(string text, string caption, ExceptionMessageBoxButtons buttons) : base(text, caption, buttons) { }
  10:          public ExceptionMessageBoxWpf(Exception exception, ExceptionMessageBoxButtons buttons, ExceptionMessageBoxSymbol symbol, ExceptionMessageBoxDefaultButton defaultButton) : base(exception, buttons, symbol, defaultButton) { }
  11:          public ExceptionMessageBoxWpf(string text, string caption, ExceptionMessageBoxButtons buttons, ExceptionMessageBoxSymbol symbol) : base(text, caption, buttons, symbol) { }
  12:          public ExceptionMessageBoxWpf(Exception exception, ExceptionMessageBoxButtons buttons, ExceptionMessageBoxSymbol symbol, ExceptionMessageBoxDefaultButton defaultButton, ExceptionMessageBoxOptions options) : base(exception, buttons, symbol, defaultButton, options) { }
  13:          public ExceptionMessageBoxWpf(string text, string caption, ExceptionMessageBoxButtons buttons, ExceptionMessageBoxSymbol symbol, ExceptionMessageBoxDefaultButton defaultButton) : base(text, caption, buttons, symbol, defaultButton) { }
  14:          public ExceptionMessageBoxWpf(string text, string caption, ExceptionMessageBoxButtons buttons, ExceptionMessageBoxSymbol symbol, ExceptionMessageBoxDefaultButton defaultButton, ExceptionMessageBoxOptions options) : base(text, caption, buttons, symbol, defaultButton, options) { }
  15:   
  16:          public void Show(Window owner) {
  17:              // the owner window is required
  18:              if (owner == null) throw new ArgumentNullException("owner");
  19:   
  20:              Type exbParentType;
  21:              Type exbType;
  22:              System.Windows.Interop.WindowInteropHelper helper;
  23:   
  24:              // The ExceptionMessageBox Show method requires a owner which implements
  25:              // System.Windows.Forms.IWin32Window - the WPF Windows don't do that
  26:              // but we can use the internal class ExceptionMessageBoxParent
  27:              // the create a appropriate owner.
  28:              exbParentType = Type.GetType("Microsoft.SqlServer.MessageBox.ExceptionMessageBoxParent, Microsoft.ExceptionMessageBox, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91");
  29:              exbType = this.GetType();
  30:   
  31:              // WindowInteropHelper allows access to the root handle of the wpf window.
  32:              helper = new System.Windows.Interop.WindowInteropHelper(owner);
  33:   
  34:              IWin32Window parent = (IWin32Window)Activator.CreateInstance(exbParentType, new object[] { helper.Handle });
  35:   
  36:              this.Show(parent);
  37:          }
  38:  }

Als Parameter lässt sich somit jedes WPF Window übergeben.

   1:              try {
   2:                  throw new ApplicationException("Hello from WPF!");
   3:              } catch (Exception ex) {
   4:                  ExceptionMessageBoxWpf ebx = new ExceptionMessageBoxWpf(ex);
   5:                  ebx.Show(this);
   6:                  throw;
   7:              }
.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

Die ExceptionMessageBox ist jedoch erstaunlich vielseitig und lässt sich auch für Meldungen jeglicher Art verwenden (siehe [2]).

Zum Weiterlesen

[1] How to: Program Exception Message Box (MSDN)
http://msdn.microsoft.com/en-us/library/ms166340.aspx

[2] Make your exceptions shine with SQL Server Exception Message Box
http://geekswithblogs.net/kobush/archive/2006/05/21/ExceptionMessageBox.aspx

Posted von Jan-Cornelius Molnar mit 1 comment(s)
Abgelegt unter: , ,
Mehr Beiträge Nächste Seite »