So wie ich das verstehe, habe ich bei Azure wieder eine VM und die Anwedung skaliert auch nur innerhalb dieser VM.
Kann ich irgendwie (automatisch) die Grenzen der VM verlassen und dadurch hoch- und runter-skalieren?
Ich hatte es mir ganz naiv so vorgestellt, dass ich die Jobs einfach an Azure übergebe und dort wird entschieden, wo der Job läuft.
ich nutze einen Web Crawler, der momentan auf einem virtuellen Server läuft. Der Web Crawler läuft innerhalb eines Windows-Dienstes, angeschlossen per WCF an eine ASP.NET-Webseite für das Starten und Stoppen der crawl jobs.
Pro crawl job wird momentan ein Backgroundworker innerhalb des Dienstes gestartet, der den crawl job ausführt und die Ergebnisse in eine MongoDB-Datenbank schreibt.
Aus Gründen der Skalierbarkeit, möchte ich gerne nach Azure umziehen.
Ich habe mir gedacht, dass jeder neue crawl job in einer eigenen (WCF-)Worker Role läuft.
Die Worker Role schreibt auch gleich die Ergebnisse des Crawl-Vorgangs in die Datenbank.
Die ASP.NET-Webseite hat einen Dienstverweis auf die WCF-Worker-Role.
Wie starte ich aber für jeden crawl job eine eigene Worker Role?
ich habe eine .net-Anwendung (einen Web-Crawler) auf meinem Server, die längere Zeit läuft. Die Anwendung möchte ich gerne über eine ASP.NET-Seite "fernsteuern", sprich starten, anhalten und Status abfragen.
Ich könnte die .net-Anwendung direkt von ASP.NET referenzieren. Ich sehe dabei aber ein Problem: Nachdem ich die ASP.NET-Seite schließe, läuft die Session ab und die .net-Anwendung wird beendet. Der Web-Crawler soll aber weiterlaufen, auch wenn keiner auf dem Server angemeldet ist.
Damit das Ganze nicht passiert, dachte ich mir, ich setze einen Windows-Dienst ein, der Befehle von der ASP.NET-Seite entgegen nimmt und die .net-Anwendung startet und am Leben hält.
Ist das der richtige Ansatz?
Wenn ja, wie greife ich von meiner ASP.NET-Seite auf den Dienst am besten zu?
für ein neues Projekt bräuchte ich einen kleinen Denkanstoß.
Ich habe eine Datenbank in der die Benutzer meiner Webseite ihre Hausadressen hinterlegen. Andere Besucher der Webseite können jetzt ihre Adresse eingeben und ich möchte die nächstgelegensten Adressen aus meiner Datenbank finden.
Ein Besucher der Webseite gibt also seine Hausadresse ein und meine Webseite soll dann (sortiert nach Entfernung) die nächstgelegensten eingetragenen Adressen aus der Datenbank ausgeben.
Ich bin mir nur noch nicht sicher, ob ich die Luftlinie oder die "richtige" (Benutzung von Straßen) Entfernung benötige. Es geht darum, dass Leute von anderen Personen etwas abholen anstatt es sich per Post zuschicken zu lassen.
Es gibt ja Karten-APIs (bing maps, google maps) aber diese sind auf X Abfragen pro Tag begrenzt und kosten dann etwas.
Wie mache ich es am geschicktesten so wenig API-Aufrufe wie möglich zu verbrauchen?
Ein Ansatz wäre ja pro eingegebener Adresse eine Entfernungsmessung zu allen eingetragenen Adresse zu machen und dann sortiert auszugeben. --> Viele API-Aufrufe und exakte Entfernung.
Ein anderer Ansatz wäre schon beim Anlegen der Adressen den Längen- und Breitengrad per API zu ermitteln und mit in der Datenbank abzuspeichern. Dann kann man wenigstens die Luftlinie berechnen. --> Wenig API-Aufrufe aber ungenau.
Ich habe herausgefunden, was schief läuft:
Visual Studio kopiert die Datenbank ins bin/Debug-Verzeichnis. Meine Anwendung schreibt dann in die mdf-Datei im bin/Debug-Verzeichnis. Die Verbindung im Datenbank-Explorer verweist aber auf die mdf-Datei im Projektordner.
Bleibt mir jetzt nichts anderes über als die Verbinungsdaten im Datenbank-Explorer auf mein bin/Debug-Verzeichnis zeigen zu lassen, damit ich die Daten sehe?
ich habe eine (dienstbasierte) Datenbank (mdf-Datei) zu meinem Projekt hinzugefügt und ein DataSet (xsd-Datei).
Meine Datenbank enthält eine Tabelle. Das DataSet enthält einen TableAdapter mit einem InsertQuery-Befehl.
Ich möchte jetzt die Datenbank mit dem InsertQuery-Befehl füllen. Der Befehl wirft keine Exception, trotzdem landen keine Daten in der Datenbank.
dsDataTableAdapters.itemsTableAdapter taItems = new dsDataTableAdapters.itemsTableAdapter();
taItems.InsertQuery("hallo", "welt");
Das Ganze habe ich in ASP.NET schon gefühlte hundert Mal gemacht und es hat immer geklappt. Leider komme ich bei dem C#-Projekt nicht weiter.
Anbei das Beispielprojekt.
Ich verstehe nicht, was ich falsch mache. Kann mir jemand auf die Sprünge helfen?
erstmal vielen Dank für deine Hilfe! Ich würde aber ganz gerne ohne zusätzliche dritte Tabelle auskommen.
Ich hab jetzt selbst mal was gebastelt, was der Sache schon sehr nahe kommt. Leider bekomme ich bei dem Ausdruck immer noch einen Fehler.
SELECT TOP (5) maincontent.id, maincontent.text
FROM maincontent INNER JOIN keywords ON maincontent.id = keywords.fk_maincontent_id
WHERE keyword in ('haus', 'auto', 'boot')
GROUP BY maincontent.id, maincontent.text
ORDER BY (select COUNT(keyword) as num, keyword from keywords
WHERE keyword in ('haus', 'auto', 'boot')
group by keyword
order by num desc);
Der Fehler lautet:
Fehler
Die ORDER BY-Klausel ist in Sichten, Inlinefunktionen, abgeleiteten Tabellen, Unterabfragen und allgemeinen Tabellenausdrücken nur dann gültig, wenn auch TOP oder FROM XML angegeben wird.
Wenn ich das letzte order-by weglasse, kommt ein anderer Fehler:
Fehler
Nur ein einziger Ausdruck kann in der Auswahlliste angegeben werden, wenn die Unterabfrage nicht mit EXISTS eingeleitet wird.
das Problem ist, dass ich als Parameter (@keywords) eine kommagetrennte Liste mit keywords übergeben möchte.
Dein Beispiel (und meines auch) funktioniert nur mit einem Keyword. Sobald ich "stichwort1,stichwort2" übergebe, wird nichts mehr zurückgegeben, obwohl die Keywords den Texten zugeordnet waren.
SELECT TOP (5) maincontent.id, maincontent.approved, maincontent.title, maincontent.description, maincontent.text, maincontent.date_added,
maincontent.fk_category_id
FROM maincontent INNER JOIN
keywords ON maincontent.id = keywords.fk_maincontent_id
WHERE (keywords.keyword IN (@keyword))
EDIT: Wenn es die Sache einfacher macht, würde ich auch auf die Untertabelle "keywords" verzichten und die Keywords kommagetrennt in einer Spalte von maincontent abspeichern. Ich glaube aber, dadruch wirds noch komplizierter.
Mein Vorhaben ist ja immer noch, die 5 "ähnlichsten" Texte zurückzuliefern.
Vielleicht wird es so etwas klarer, wie mein Aufbau ist:
Im Frontend meiner Anwendung kann man einen Text eintippen (landet in der Tabelle maincontent) und zu dem Text keywords (landet in Tabelle keywords).
maincontent und keywords sind mit einer Fremdschlüsselbeziehung miteinandern verknüpft.
Ich möchte meinen Text außenvor lassen. Es geht mir nur um die Keywords.
Es sollen die 5 ähnlichsten Texte gefunden werden. Ähnlich heißt bei mir, es sollen so viele Keywords wie möglich übereinstimmen. Das ganze sortiert nach Anzahl der übereinstimmenden Keywords.
verwendetes Datenbanksystem: MSSQL Server 2008R2 Express
Hi,
ich habe zwei Tabellen maincontent und keywords. Keywords hat eine Fremdschlüsselbeziehung zu maincontent.
Hintergrund: Ich speichere Texte und dazu Keywords. Ich möchte nun anhand der eingegebenen Keywords ähnliche Texte zurückgeben lassen. Ähnlich = enthält so viele gleiche Keywords wie möglich.
Mein erster SQL-Versuch war folgender:
select top(5) * from maincontent left join keywords on maincontent.id = keywords.fk_keyword_id where keywords.id in (@keywords)
Das das nicht richtig funktioniert, habe ich selbst gemerkt. Da ja nicht die Trefferanzahl der Keywords berücksichtigt wird. Es wird nur geguckt, ob alle Keywords darin vorkommen.
Kann mir jemand bei dem SQL-Befehl auf die Sprünge helfen?
Page.GetRoutUrl gibt einem ja anhand von Parametern eine suchmaschinenfreundliche URL zurück. Die Sache ist nur die: Wenn der Parameter Leerzeichen enthält, wird daraus richtigerweise ein "%20" gemacht, damit die Browser damit auch was anfangen können. z.B. seite.de/rotes%20Auto/
Kann ich die URLs aus SEO-Sicht so lassen oder sollte ich selbst noch handanlegen und z.B. Leerzeichen, Sondernzeichen und Umlaute ersetzen, damit die URL "lesbarer" wird? z.B. seite.de/rotes-Auto/ (Leerzeichen durch Bindestrich ersetzt)
Was gefällt Google und Co und dem Benutzer lieber?
In Firefox wird die URL mit Leerzeichen angezeigt in der Adressleiste. In IE9 und Chrome wird der %20-Platzhalter verwendet.
Wäre schade, wenn es nicht so eine Liste geben würde. So eine Liste (automatisiert) zu erstellen wäre schon ein Projekt wert. Da hätten bestimmt einige Leute bedarf daran.
danke für deine Antwort.
Blöde Frage aber, wie bekomme ich die DB im Management-Studio zu gesicht? Ich sehe dort nur eine master.mdf und noch weitere Datenbanken (sitze grade nicht an meinem Entwicklungsrechner) aber nicht meine offline geschaltete Datenbank.
EDIT: Um nochmal alles klar zu stellen: Ich habe die Datei nicht übers Management-Studio angelegt, Visual Studio hat die mdf-Datei selbst angelegt. Daher hatte ich nie Zugriff auf die Datei per Management-Studio und habe es jetzt auch nicht.
ich habe folgendes innerhalb meiner ASP.NET-Webseite ausgeführt und damit meine Datenbank(datei) offline gesetzt:
"ALTER DATABASE [MEINE_DATENBANK] SET OFFLINE WITH ROLLBACK IMMEDIATE"
Jetzt kann ich mich nicht mehr zur Datenbank verbinden. Ich habe versucht die Datenbank wieder online zu bringen, leider ohne Erfolg. Ich weiß ehrlich gesagt nicht, wo ich den Befehl "ALTER DATABASE [MEINE_DATENBANK] SET ONLINE" eingeben soll. Die ASP.NET-Seite gibt beim Datenbankzugriff jetzt diese Meldung:
Die Standarddatenbank des Benutzers kann nicht geöffnet werden. Fehler bei der Anmeldung.
Fehler bei der Anmeldung für den Benutzer 'Mein_Benutzer'.
Ähnliche Meldung gibt das SQL Server Management Studio, wenn ich die Datenbankdatei (MDF) attachen will.
Wie bekomme ich meine Datenbank wieder in die Gänge?
Ich gehe davon aus, dass die Seite noch nicht fertig geladen ist.
Das Webbrowser-Control ein hat event, das Navigate_Complete oder so ähnlich heißt. Lass in dem Event auf den Button klicken.
verwendetes Datenbanksystem: MS SQL 2008 R2 Express
Hi,
ich versuche grade vergeblich ein foreign key constraint zu erstellen, bekomme aber immer eine Fehlermeldung (siehe Screenshot).
Beide Spalten haben den gleichen Datentyp und in beiden Tabellen haben die benutzten Spalten die gleichen Werte. Also in fk_user_id stehen die gleichen Werte wie in ProviderUserKey.
Ist es ein Problem, dass die Tabelle bereits Daten enthalten? Ich kann die Tabellen schlecht leeren um das auszuprobieren, weil auf der yaf_User-Tabelle wiederum constraints sitzen die mir das Löschen verweigern.
Ich hätte vielleicht dazu sagen sollen, dass ich sehr wohl weiß wie groß meine Bilder (Thumbnails sind alle gleich groß) sind. Außerdem hat meine Seite eine fixe Breite. Serverseitig kann ich also schon ausrechnen, wieviele Bilder nebeneinander passen und wann eine neue Zeile begonnen werden muss.
ich möchte eine art Gallerie realisieren mit einfachsten Mitteln.
Ich habe Bilder-Informationen in einer Datenbank und die zugehörigen Bilder auf der Festplatte.
Ich möchte Bilder nebeneinander bzw. wenn eine Zeile voll ist (meine Webseite hat eine fixe Breite) untereinander anzeigen.
Meine Frage ist, welches Control eignet sich zum Anzeigen der Bilder am Besten? Ein Gridview kann ja standardmäßig nur Einträge untereinander anzeigen oder?
Wie wäre es mit einem FormView?
Oder sollte ich per Placeholder die Controls selber dynamisch auf der Seite erzeugen? (Ich bräuchte eigentlich nur ein Image und ein Label pro Bilder-Datensatz).
ich möchte gerne verschiedene Funktionen hintereinander ausführen. Dazwischen liegen verschiedene Wartezeiten. Nach einem Durchlauf sollen die Funktionen erneut aufgerufen werden, usw. bis der User "Stop" oder "Pause" drückt. Ich habe eine Windows-Forms-Anwendung.
Zuerst habe ich einfach mittels Thread.Sleep zwischen den Funktionen gewartet. Das ist leider unvorteilhaft, da dadurch die Anwendung eingefroren wird.
Ich habe mir gedacht, die beste Lösung, und immer hier im Forum empfohlen, sei ein Timer. Jedoch wird dadurch der Programmablauf sehr unübersichtlich, was ich mit folgedem Code verdeutlichen will:
private void tmrDoWork_Tick(object sender, EventArgs e)
{
//timer stoppen, damit er sich nicht "überschlägt"
tmrDoWork.Stop();
//pause-funktion
if (currWorkState == WorkState.Pause)
{
tmrWork.Interval = 100;
tmrWork.Start();
return;
}
if (currWorkState == WorkState.Method1)
{
Method1();
currWorkState = WorkState.Method2;
tmrWork.Interval = 100;
tmrWork.Start();
return;
}
if (currWorkState == WorkState.Method2)
{
//solange bedingung nicht erfüllt ist, 2 sekunden warten und erneut prüfen
if (!Bedingung())
{
tmrWork.Interval = 2000;
tmrWork.Start();
return;
}
else
{
currWorkState = WorkState.Method3;
tmrWork.Interval = 10000;
tmrWork.Start();
return;
}
}
if (currWorkState == WorkState.Method3)
{
Method3();
tmrWork.Interval = 1;
tmrWork.Start();
return;
}
}
Das Ganze mit mitteln wie Thread.Sleep sieht viel übersichtlicher aus und ist leichter zu verstehen:
Wie macht man es "richtig", damit sich der Programmcode besser lesen lässt? Ist der Timer die richtige Wahl oder sind andere Instrumente besser geeignet? BackgroundWorker, Threads...
Der Linktext sowie der Link ändert sich immer. Es soll im Prinzip ein Linktausch werden bei dem die User ein Script auf Ihre Website einbauen. Es soll dann ermittelt werden wie oft der Link angezeigt und angeklickt wurde. Letzteres ist kein Problem nur hänge ich immer noch dabei fest, Werte zurück an die externe Seite zu übermitteln, trotz Response.ContentType = "text/javascript"; wird immer nur eine leere Seite angezeigt.
Brauch ich nun wirklich einen eigenen HttpHandler? Ich verstehe nicht ganz, dass mein Beispiel nicht klappt. Die Page_Load-Funktion wird ja korrekt aufgerufen aber der Response.Write-Code landet nicht auf der externen Seite.
Sorry, wenn ich mich doof anstelle.
ich versuche mich grade daran herauszufinden, wie oft ein Link auf einer externen Seite von Besucher "gesehen" wurde. Leider bisher ohne Erfolg.
Ich gehe dabei so vor:
Ich habe ein Javascript auf der externen Seite, dass als Script-Source meine aspx-Seite enthält. Beim Aufruf des Scriptes wird auch tatsächlich das Page_Load-Event meiner aspx-Seite aufgerufen.
Nun möchte ich aber gerne noch von meiner aspx-Seite den Linktext an die externe Seite geben. Ich habe also aus der Default.aspx alles entfernt und nur im Page_Load-Event ein
Wenn ich jetzt die externe Seite aufrufe, erwarte ich eigentlich, dass der Inhalt "Hallo 123" ausgegeben wird. Stattdessen bekomme ich eine weiße Seite.