Für ein neues Projekt habe ich caliburn.micro gewählt, und stecke nun beim DataBinding mit dem ListPicker fest. Wenn ich statt des ListPickers eine normale DropDown nehme, funktioniert das Binding wie es soll. Also es werden alle Elemente angezeigt und bei einer Auswahl wird das SelectedItem Property korrekt gesetzt.
Ich habe ein Grid, welchem ich zur Laufzeit neue Spalten hinzufüge oder entferne. Diese DataGridComboBoxColumn-Spalten habe ein ItemsSource- sowie ein SelectedItem-Binding.
Das Problem ist nun, sobald ich die Spalten einmal ausgeblendet habe und danach wieder einblenden möchte, funktioniert das SelectedItem-Binding nicht mehr, die Spalten sind dann einfach leer. Ich habe das gleiche Verhalten, wenn ich die Spalten jedes Mal lösche und dann wieder neu erstelle und hinzufüge.
So erstelle ich meine Spalte im CodeBehind:
private static DataGridColumn GetListColumn(ListAttribute attribute, BindingBase binding) {
string path = string.Format(
CultureInfo.InvariantCulture,
"AttributeValues.Attributes[{0}].ListItems",
attribute.ID);
var sourceBinding = new Binding {
Path = new PropertyPath(path)
};
var column = new DataGridComboBoxColumn();
var style = new Style(typeof(ComboBox));
style.Setters.Add(new Setter(ItemsControl.ItemsSourceProperty, sourceBinding));
column.ElementStyle = style;
column.EditingElementStyle = style;
column.SelectedItemBinding = binding;
column.DisplayMemberPath = "Name";
return column;
}
Und so lösche oder erstelle ich die Spalten:
private void UpdateColumns() {
foreach (var attributeColumn in _attributeColumns) {
GridItems.Columns.Remove(attributeColumn);
}
_attributeColumns.Clear();
if (ViewModel.EditorType == SectionEditorType.Attribute) {
var builder = new AttributeColumnBuilder();
var attributes = ((PartsSubViewModel)ViewModel).SectionPartAttributes;
foreach (var column in builder.GetColumns(attributes)) {
_attributeColumns.Add(column);
GridItems.Columns.Add(column);
}
}
}
Damit man sich das besser vorstellen kann, habe ich ein Bild angehängt.
Die Spalte, die noch Werte anzeigt, ist eine die im XAML definiert und daher nicht betroffen ist.
Data Source=127.0.0.1;Initial Catalog=db;User ID=usr;Password=pw;MultipleActiveResultSets=true;
Wie bereits erwähnt, hat mich googeln, resp. bingen, auf das One Session per Request Pattern aufmerksam gemacht, das von NHibernate empfohlen wird. Ich habe dies nun mit einem HttpModule umgesetzt, was eine grosse Besserung bezüglich der Server-Last brachte.
Aktuell habe ich einzig noch ab und zu das Problem, dass ich eine LazyInitializationException erhalte. Aber nicht wirklich reproduzierbar. Kann es sein, dass die Session an den Objekten haften bleibt, wenn ich diese über Threadgrenzen hinweg in einem CacheService behalte?
Danke für die schnelle Antwort. Es handelt sich bei der Datenbank um ein SqlServer 2008 R2 Express. Die DB befindet sich auf dem gleichen Server und hat eine durchschnittliche CPU-Auslastung von unter einem Prozent, daher liegt es kaum an der Datenbank :(
Ich bin beim googeln auf das "One Session per Request"-Pattern gestossen, welches man mittels HttpHandler implementieren soll. Hat da jemand einen Vorschlag, wie man das am besten implementieren soll? Habe bisher Codesnippets für asp.net mvc gefunden, nicht für classic asp.net.
Seit einem halben Jahr arbeite ich an einem Projekt, welches am 2. Januar veröffentlicht wird. Seit heute, 1. Januar, sind die switch-Umstellungen (switch.ch ist die Schweizer Domain-Registrierungsstelle) gemacht und seit dann ist die Seite permanent überlastet. Auf dem Server läuft der w3wp.exe Dienst auf 100% und das arbeiten ist fast unmöglich.
Bis gestern hatten wir gar keine Probleme, aber seit der Umstellung geht gar nichts mehr. Wir haben temporär eine index.html Seite erstellt, die anzeigt, dass die Seite derzeit umgestellt wird. Für die index.html Seite habe ich im UrlRewritig die DefaultPage auf index.html gesetzt.
Zum einen sehe ich in den IIS-Logs diverse Anfragen von Bots, die jedoch alle mit 404 beantwortet werden, da es diese Files nicht mehr gibt.
Zum anderen wird an manchen Stellen via Javascript ein WCF Service aufgerufen mittels DOMAIN/CalenderService.svc/js.
Meist erhalte ich ThreadAbortExceptions von NHibernate, kann aber nicht wirklich einen Fehler beim NHibernate finden. Ich nutze übrigens FluentNHibernate. Zudem habe ich an NHibernate-Mapping ja nichts geändert, seit der Umstellung.
Mittels dem EQATEC-Profiler versuchte ich herauszufinden, wo das Problem liegen könnte, fand aber nichts spezifisches.
Meine grösste Bitte: Wie kann ich den Fehler näher eingrenzen? Wie finde ich heraus, wo das Problem liegt? Gibt es Tools oder Logfiles, die mir weiterhelfen könnten?
Liebe Grüsse
Michael
Anhang
Häufige Exceptions aus dem Logfile
01.01.2011 19:45:45|Error|General|WIN-PRNQ2O17GTP|Type: HttpUnhandledException
Message: Exception of type 'System.Web.HttpUnhandledException' was thrown.
Source: System.Web
at System.Web.UI.Page.HandleError(Exception e)
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
at System.Web.UI.Page.ProcessRequest()
at System.Web.UI.Page.ProcessRequest(HttpContext context)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
Inner Exception:
Type: ADOException
Message: could not execute query
[ select website0_.Id as Id34_, website0_.Guid as Guid34_, website0_.Name as Name34_, website0_.DefaultPageId as DefaultP4_34_, website0_.DefaultDomainId as DefaultD5_34_ from Website website0_ inner join Domain domains1_ on website0_.Id=domains1_.WebsiteId where domains1_.Name like ? ]
Name:domain - Value: ?
[SQL: select website0_.Id as Id34_, website0_.Guid as Guid34_, website0_.Name as Name34_, website0_.DefaultPageId as DefaultP4_34_, website0_.DefaultDomainId as DefaultD5_34_ from Website website0_ inner join Domain domains1_ on website0_.Id=domains1_.WebsiteId where domains1_.Name like ?]
Source: NHibernate
at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters)
at NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters)
at NHibernate.Hql.Ast.ANTLR.Loader.QueryLoader.List(ISessionImplementor session, QueryParameters queryParameters)
at NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.List(ISessionImplementor session, QueryParameters queryParameters)
at NHibernate.Engine.Query.HQLQueryPlan.PerformList(QueryParameters queryParameters, ISessionImplementor session, IList results)
at NHibernate.Impl.SessionImpl.List(String query, QueryParameters queryParameters, IList results)
at NHibernate.Impl.SessionImpl.List(String query, QueryParameters parameters)
at NHibernate.Impl.QueryImpl.List()
at NHibernate.Impl.AbstractQueryImpl.UniqueResult[T]()
at Cms.Bll.WebsiteService.GetByDomain(User user, String domain) in C:\Users\Michi\Documents\Programmieren\SVN Projekte\cms für gvc\Cms\Cms.Bll\MediaCenter\MediaContentService.cs:line 262
at IWebsiteServiceProxy56420579342844c991e288056648cceb.InvocationGetByDomain_1.InvokeMethodOnTarget()
at Cms.Contracts.Interceptors.LoggingInterceptor.Intercept(IInvocation invocation) in C:\Users\Michi\Documents\Programmieren\SVN Projekte\cms für gvc\Cms\Cms.Contracts\AclProviderService.cs:line 34
at IWebsiteServiceProxy56420579342844c991e288056648cceb.GetByDomain(User user, String domain)
at Cms.Web.BasePage.get_CurrentWebsite()
at Cms.Web.BasePage.OnPreInit(EventArgs e)
at System.Web.UI.Page.PerformPreInit()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
Inner Exception:
Type: SqlException
Message: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
Source: .Net SqlClient Data Provider
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket()
at System.Data.SqlClient.TdsParserStateObject.ReadByte()
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK)
at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, TimeoutTimer timeout)
at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, TimeoutTimer timeout, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance)
at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance)
at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)
at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.SqlClient.SqlConnection.Open()
at NHibernate.Connection.DriverConnectionProvider.GetConnection()
at NHibernate.AdoNet.ConnectionManager.GetConnection()
at NHibernate.AdoNet.AbstractBatcher.Prepare(IDbCommand cmd)
at NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand cmd)
at NHibernate.Loader.Loader.GetResultSet(IDbCommand st, Boolean autoDiscoverTypes, Boolean callable, RowSelection selection, ISessionImplementor session)
at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters)
Habe das Problem gelöst, es lag an einem falschen (MPEG4) Video-Stream innerhalb des MP4-Containers. Habe nun meinen FFMPEG-Aufruf so angepasst, dass H264 rauskommt. Nun muss der iTunes nur noch merken, dass er das Format trotzdem abspielen kann, das schnallt der noch nicht. Aber das ist ein anderes Problem, kein Silverlight-Problem.
Ich versuche nun schon die ganze Woche, Videos im MP4 Format in Silverlight abzuspielen. Gemäss Microsoft ist MP4 mit AAC ja seit Silverlight 3 unterstützt, dennoch erhalte ich die Fehlermeldung 3001 AG_E_INVALID_FILE_FORMAT.
Als Player habe ich den SMFPlayer eingebunden, die Zuweisung im .xaml.cs geschieht folgendermassen:
var videoItem = new PlaylistItem();
videoItem.Duration = TimeSpan.FromSeconds(myMediaContent.Duration);
videoItem.MediaSource = new Uri(myMediaContent.FileDownloadUrl);
mySmfPlayer.Playslist.Add(videoItem);
Bei einem wmv-Video funktioniert das auch super, aber da ich die gleichen Videos auch als Podcast anbiete, kann ich nicht wmv verwenden, da der iTunes damit keine Freude hat.
Ich hoffe ihr könnt mir weiterhelfen,
Grüsse Michael
Eine andere Web.config habe ich nicht. Im original-Web.config hatte ich die Einträge auch von Hand gemacht gehabt, aber die haben ja eben nicht funktioniert. Für mich hört sich das irgendwie nach Bug an. Evtl. hat es auch damit zu tun, dass die Einträge im Web.config alle den gleichen Tag-Prefix hatten.
Nun registriere ich die Controls auf jeder Page von Hand. So funktioniert es. Sobald ich die Einträge im Web.config wieder hinzufüge, funktioniert es nicht mehr.
Mein Problem ist somit zwar gelöst, aber warum das so ist, verstehe ich nicht...
So wie ich das verstehe, ist dir egal, ob es eine consolen-exe oder eine dll ist, korrekt? Dann definiere doch ein interface mit einer Methode im Stil von "Dictionary<string, string> Run(string s)". Dann erstelle beliebig viele DLLs mit Implementationen dieses Interfaces und lade diese DLLs in deine Webanwendung hoch.
DLLs kannst du dynamisch in eine eigene Application Domain laden, dieser Linkzeigt wies geht.
Wenn du dann noch einen File-Watcher auf dein Upload Directory machst, werden die DLLs automatisch geladen, nachdem du das File raufgeladen hast.
Ich habe mal alles in ein Testprojekt extrahiert - und ja, der Fehler tritt immer noch auf. Das Testprojekt habe ich angehängt. Ist ein VS2008 Projekt.
Der Aufruf ist: http://localhost:51139/Admin/NewPage.aspx
Die Logging-Komponente habe ich auch abgehängt, der Fehler tritt aber im NewPageController in der Methode Page_Load auf.
Eigentlich bin ich ja kein Web-Anfänger, aber diese Woche fühle ich mich wirklich wie einer. Warum? In der Page_Load Funktion sind meine Objekte (statische, keine dynamischen) null. Und daher erhalte ich logischerweise eine NullReferenceException.
Alle Controls sind in den jeweiligen *.ascx.designer.cs deklariert und in den *.ascx files eingebunden. Sind also statische Controls. Mein Verständnis von ASP.NET ist eigentlich, dass diese Controls während des Lifecycle erstellt werden. Bei mir scheint dies aber nun nicht der Fall zu sein - an was könnte das liegen?
Die Exception taucht in der Klasse NewPageController in der Methode Page_Load in der ersten Zeilte auf.
dieser Beitrag hat sich erledigt, ich setze nun auf DynamicObjects vom CaslteProject, dort kann man beliebig viele Interceptoren an ein Objekt ranhängen.
Für ein aktuelles Projekt nutze ich einen IoC Container, der mir über meinen Service zwei verschiedene Proxies stülpt. Das sieht dann so aus:
var impl = myContainer.Resolve<T>();
var logger = myContainer.Resolve<ILoggingService>();
var cacheService = myContainer.Resolve<ICacheService>();
impl = getCachingProxy<T>(impl, cacheService);
impl = getLoggingProxy<T>(impl, logger);
return impl;
Die Funktion getCachingProxy sieht so aus, diejenige für den LoggingProxy ähnlich:
private static T getCachingProxy<T>(T service, ICacheService cacheService)
{
var proxy = new CachingProxy<T>(cacheService, service);
return proxy.GetTransparentProxy();
}
Sobald ich aber nun mit zwei Proxys arbeite, funktioniert der Aufruf nacher nicht mehr. Wenn ich nur einen Proxy verwende (egal welchen) funktioniert der Aufruf.
und genau bei pageService.LoadAll(); erhalte ich dann die TargetException mit der Meldung "Object does not match target type.". Meine Proxies erben übrigens von System.Runtime.Remoting.Proxies.RealProxy.
Kennt sich da jemand aus und kann mir helfen?
Danke!
Ich habe ein sehr komisches Problem. Ich lade auf zwei verschiedenen Seiten ein Control. Auf der einen Seite funktioniert alles perfekt, der Debuger geht durch die Funktionen OnPreRender und OnInit durch, die Anzeige ist gut. Auf der anderen Page hingegen werden beide Methoden nicht aufgerufen (der Breakpoint wird nicht angesprungen) und das Control wird nicht angezeigt. Ich setze aber vorher ein Property, was ohne Exception funktioniert.
Danke für deine Ausführungen. Also mit Generics habe ich mich mal kurz beschäftigt, resp. einen Webcast angeschaut. Solange sich sonst nichts geändert hat, denke ich, ich kann es wagen auf 2.0 zu programmieren.
Wie sieht es mit dem Web-Developer aus? VS03 hat bei HMTL-Darstellungen manchmal ziemlich mühe. Ich möchte das Design auch im VS machen, nicht noch den Dreamweaver bemühen - verstehe ich das richtig das die sogn. Masterpages das gleiche sind wie Templates im Dreamweaver?
Ich werde demnächst an einem Wettbewerb teilnehmen und muss mich entscheiden ob ich mit .NET2 oder mit 1.1 arbeiten will. Mein Problem ist, dass ich noch nie mit .NET2 gearbeitet habe und auch nicht mit dem VS05. Das Projekt wird eine Web-Anwendung sein.
Was würded ihr mir raten? Ich werde auch nicht mehr dazu kommen mich genügend einzuarbeiten. Sind die änderungen gravierend? Oder nur eher minimal und überwiegt der Nutzen von 05 extrem? Was wären die Vorteile?
Die folgende Klasse liegt als .cs Datei in einem Ordner und wird zur Laufzeit Kompiliert. Das kompilieren läuft wunderbar, das Assembly ist ja danach nicht null und gibt den Typ "Skript" zurück...
using System;
using PluginScriptingFramework.Scripting;
namespace FrameWorkTest {
/// <summary>
/// Summary description for Skript.
/// </summary>
public class Skript : IScript {
#region IScript Members
public DateTime Datum {
get { return new DateTime(2006,03,31,18,30,0); }
}
public string Autor {
get { return "Michi"; }
}
public void Run() {
SayHello("Hans");
SayHello("Fritz");
}
public Version Version {
get { return new Version(0, 1); }
}
public string Beschreibung {
get { return "Beschreibung"; }
}
#endregion
private void SayHello(string name) {
Console.WriteLine("Hello {0}", name);
}
}
}
private IList GetScriptsFromAssembly(Assembly asm) {
ArrayList al = new ArrayList();
foreach(Type type in asm.GetTypes()) {
// auf diese Art ist obj = null
MarshalByRefObject obj = asm.CreateInstance(type.FullName) as MarshalByRefObject;
// auf diese Art ist obj ebenfalls = null
obj = asm.CreateInstance(type.FullName, false, BindingFlags.Public |
BindingFlags.Instance | BindingFlags.CreateInstance, null,
new object[] {}, null, null) as MarshalByRefObject;
if(obj is IScript)
al.Add(obj);
}
return al;
}
Das Assembly, welches übergeben wird, ist nicht null. Es enthält ein Type namens "Skript". Und obwohl der Type "Skript" in der foreach-Schleife gefunden wird, liefert CreateInstance() null zurück. Warum? In der Doku steht, null wird zurückgeliefert, wenn der Type nicht gefunden wird. Doch wenn dies der Fall wäre, käme er ja nicht in die Schleife...
Ich möchte mein Problem ein wenig ausführlicher beschreiben:
AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
setup.PrivateBinPath = "Plugin";
setup.ShadowCopyFiles = "true";
AppDomain app = AppDomain.CreateDomain("PluginDomain", AppDomain.CurrentDomain.Evidence, setup);
ArrayList assemblies = new ArrayList(app.GetAssemblies());
ArrayList plugins = new ArrayList();
foreach(Assembly asm in assemblies) {
plugins.AddRange(GetPlugin(asm));
}
foreach(IPlugin p in plugins)
Console.WriteLine("Plugin: " + p.Name);
setup.ApplicationBase ist das Verzeichnis in dem ich die Anwendung startete. Dort habe ich einen Unterordner "Plugin" in welchem ich eine Assembly habe. Doch die ArrayList assemblies hat nur eine Assembly drin, die mscorlib.dll! Warum? Ich blicke nicht durch...
Hoffe ihr könnt mir helfen
Dann mach doch aus den beiden Oberflächen je ein Usercontrol, dem du den Status übergeben kannst. Dann kannst du zur Laufzeit einfach das UC auswechseln...
Original von talla
Hab grad deinen Blog gelesen brauchst du das Beispiel noch? Also so wie ich es momentan verwende kann ichs dir eh leider nicht überlassen, aber könnte dir ne kleine "Technologiedemo" zeigen wo ich das in den Anfängen mal selber ausprobiert habe wie das funktioniert.
Gruß Talla
Hallo Talla, ist das Angebot noch Aktuell? Ich würde gerne mal reinschauen! Habe mich den ganzen Tag mit AppDomains und Setups herumgeschlagen, aber irgendwie komme ich auf keinen grünen Zweig
Ich beginne nächste Woche mit meiner Facharbeit. Die Projektplanung mache ich grösstenteils in UML. Da die Arbeit bewertet wird frage ich mich nun, wie ich die Eigenschaften von Klassen in UML abbilden soll, da sie ja weder Attribute noch Operationen sind. Ich habe mal eine Grafik angehängt.
Was meint Ihr? Variante 1 oder 2?
Quellcode der Klasse:
public class VarianteN {
private string name;
private string vorname;
public VarianteN() {
}
public string Name {
get { return name; }
set { name = value; }
}
public string Vorname {
get { return vorname; }
set { vorname = value; }
}
}