Laden...

Forenbeiträge von Rioma Ingesamt 228 Beiträge

31.03.2016 - 21:56 Uhr

Da hatte ich einige Dinge ja immerhin richtig in Erinnerung. Danke für den Link.

31.03.2016 - 20:43 Uhr

Danke erstmal. Was genau meinst du mit:

Ein Weg wäre den Eintrag im Hintergrund zu speichern und dann die komplette Liste neu zu laden.

?

Ich werde morgen mal gucken, was es bringt die Anzahl der Liste zu halbieren. Wo genau ist der Unterschied zwischen dem Angular 1.X Binding und dem neuen Angular 2 Biinding?

Soweit ich weiß merkt sich Angular 1.X den original Wert und vergleicht ihn immer wieder --> dirty checking. Aber was genau macht Angular 2 anders?

  1. Aufbau der Anwendung als Tree
  2. Jede Komponente hat einen eigenen Change-Tracker
  3. Kein automatisches Two-Way Binding
  4. Insgesamt performantere Implementierung

Aber trotzdem wird der "Tree" immer und immer wieder nach Änderungen durchsucht. Gibt es hier Unterschiede wie oft das passiert, oder habe ich etwas falsch verstanden?

31.03.2016 - 17:39 Uhr

Hallo zusammen,

ich hätte eine kurze Frage bezüglich AngularJS (1.5).

Problem: Es gibt eine Liste mit maximal 100 Einträgen. Normalerweise werden die 100 Einträge erreicht. Pro Eintrag kann relativ viel bearbeitet werden. Sodass schnell mal 1200 - 1500 Felder überwacht werden müssen. Durch Suchfilter können die Einträge über eine Datenbank gefiltert werden. (Hier kann es natürlich wieder zu 100 Einträgen kommen). Leider ist das Rendern nicht gerade performant. Das One-Way Binding ist um einiges schneller.

Ist es mit Angular-Mitteln möglich, aus einem One-Way Binding die Daten zu bekommen? Sodass erst wenn der Benutzer speichert, alle Änderungen in die Objekte geschrieben werden? (ohne Changetracking) Ich denke das würde die Performance definitiv verbessern.

Habt ihr andere Vorschläge?

Die Anzahl der Einträge zu verringern wäre die letzte Möglichkeit.

Danke

24.03.2016 - 12:15 Uhr

Danke nochmal für den Hinweis. Ich werde mir das zweite Video angucken und meine Implementierung nochmal überdenken

22.03.2016 - 13:53 Uhr

Ich habe nach einer Token basierten Lösung gesucht, die möglichst ähnlich zu meiner vorherigen Lösung war. Hier unter Step 9: http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/
Allerdings wurde scheinbar der OAuthAuthorizationServerProvider nicht nach asp.net core 1 portiert. (Ich kann gerade nicht sagen, wo ich das gelesen habe)

Ich bin dann auf mehrere Möglichkeiten gestoßen: Identity Server 4 zum Beispiel.
Oder eben der OpenIdConnect.Server: https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server

Da sich dieser sehr stark an der "alten" Lösung orientiert, habe ich mir die Implementierung genauer angesehen.

Zum Beispiel die Default URL's: https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server/blob/vNext/src/AspNet.Security.OpenIdConnect.Server/OpenIdConnectServerDefaults.cs

Oder https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server/blob/vNext/src/AspNet.Security.OpenIdConnect.Server/IOpenIdConnectServerProvider.cs

Wichtig für mich war die Beschreibung zu


Task GrantResourceOwnerCredentials(GrantResourceOwnerCredentialsContext context);


 /// <summary>
        /// Called when a request to the Token endpoint arrives with a "grant_type" of "password". This occurs when the user has provided name and password
        /// credentials directly into the client application's user interface, and the client application is using those to acquire an "access_token" and 
        /// optional "refresh_token". If the web application supports the
        /// resource owner credentials grant type it must validate the context.Username and context.Password as appropriate. To issue an
        /// access token the context.Validated must be called with a new ticket containing the claims about the resource owner which should be associated
        /// with the access token. The application should take appropriate measures to ensure that the endpoint isn't abused by malicious callers.  . 
        /// The default behavior is to reject this grant type.
        /// See also http://tools.ietf.org/html/rfc6749#section-4.3.2
        /// </summary>
        /// <param name="context">The context of the event carries information in and results out.</param>
        /// <returns>Task to enable asynchronous execution</returns>

Implementierung:


 app.UseJwtBearerAuthentication(options =>
            {
//Url und Port des OpenID Connect Servers --> selbe Anwendung, daher localhost + port
                options.Audience = "http://localhost:55257/";
                options.Authority = "http://localhost:55257/";
                options.AutomaticAuthenticate = true;
                options.AutomaticChallenge = true;
                options.RequireHttpsMetadata = false;
               
            });

 app.UseOpenIdConnectServer(options =>
            {
                options.Provider = new AuthorzationServerProvider();
            });

AuthorzationServerProvider erbt von OpenIdConnectServerProvider und implementiert


 GrantResourceOwnerCredentials(GrantResourceOwnerCredentialsContext context)

Hier wird die ClaimsIdentity erstellt und das AuthenticationTicket wird über


context.Validated(ticket);

validiert. Name und Passwort stehen in context.UserName und context.Password.

Der Client an sich ist immer valide:


 public override Task ValidateClientAuthentication(ValidateClientAuthenticationContext context)
        {
            context.Skipped();
            return Task.FromResult<object>(null);
        }

EDIT: Im AuthorzationServerProvider muss der Ressource-Server entsprechend angegeben werden. (Identisch zu den JwtBearer Optionen )


ticket.SetResources(new[] { "http://localhost:55257/" });
ticket.SetAudiences(new[] { "http://localhost:55257/" });

22.03.2016 - 10:43 Uhr

Ich habe mir das Video gestern angeguckt und mich weiter eingelesen.
Ich habe mich für den OpenId Connect Server entschieden.

Wenn man OnGrantResourceOwnerCredentials implementiert, hat man auch die Möglichkeit mit grant_type -- password zu arbeiten. Weiter geht es dann mit den Claims und dem AuthenticationTicket für den Benutzer. Der Connect Server läuft auch ohne Probleme in der selben Applikation.

Allerdings hätte ich noch 2 Fragen, auf die ich bisher keine Antwort habe:

1.) In der OAuthAuthorizationServerProvider Implementierung konnte man im TokenEndpoint über AdditionalResponseParameters dem Benutzer Daten zurück geben. Wie sieht die alternative aus?

2.) Was genau steckt hinter dem "Logout"? Wir hier lediglich das Token ungültig gesetzt? Oder wird hier etwas aus dem Cache entfernt, was sonst drin bleibt? Muss der LogoutEndpointPath gesetzt und implementiert sein, oder reicht es, wenn ich den Pfad setze und im Client beim Logout aufrufe?

Danke

Edit: Nr. 2 ist leider etwas größer geworden. Sollten die Fragen irgendwo beantwortet sein, werde ich mir dort natürlich gerne einlesen.

EDIT: So wie die Implementierung unter https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server/blob/vNext/src/AspNet.Security.OpenIdConnect.Server/OpenIdConnectServerProvider.cs aussieht, reicht es wohl nicht den Logout Pfad aufzurufen. Daher die Frage, was passiert, wenn ich keine Implementierung habe?

21.03.2016 - 14:24 Uhr

Alles klar, danke

21.03.2016 - 13:53 Uhr

Danke erstmal. Ich habe in der letzten Stunde mal das Netz "durchforstet" aber ein Beispiel habe ich dazu leider nicht gefunden. Könntest du mich da nochmal in die richtige Richtung schupsen?

Ich habe gesehen, dass jeder Tokenprovider IUserTokenProvider implementiert und man dann entsprechend natürlich seinen eigenen schreiben könnte. Aber beim validieren kann man wahrscheinlich auch viel falsch machen.

Darf ich fragen, wie du meine Anforderung umsetzen würdest?
*Token basiert. (Bearer oder JWT) *Möglichst leichtgewichtig *am liebsten intern (aber kein muss) Niemand anderes außer die Web Api wird den Authorization-Server nutzen *Benutzerbezogene Daten müssen zugänglich sein. Claims?

Vielen Dank

21.03.2016 - 12:16 Uhr

Danke das Video werde ich mir ansehen (ist gerade leider nicht möglich).

Die vorherige Implementierung sah so aus:


OAuthAuthorizationServerOptions oAuthServerOptions = new OAuthAuthorizationServerOptions()
{
                TokenEndpointPath = new PathString("/authtoken"),
                AccessTokenExpireTimeSpan = TimeSpan.FromHours(1),
                Provider = new AuthorizationServerProvider()
};

app.UseOAuthAuthorizationServer(oAuthServerOptions);

app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

Der AuthorizationServerProvider erbte von OAuthAuthorizationServerProvider und in der Methode GrantResourceOwnerCredentials konnte man dann mit Username und Password arbeiten. Man erzeugt ein validiertes AuthenticationTicket und um des Rest musste man sich nicht mehr "kümmern".

So weit ich gelesen habe, wurde das für Asp.net Core nicht portiert und bisher habe ich lediglich sehr "mächtige" beispiele mit einem externen Authorization-Provider gesehen.

Gibt es eine leichtgewichtige Möglichkeit für Asp.net Core, die genau das abdeckt? Interner Authorization-Server. Dem Benutzer können Daten zurückgegeben werden und Benutzerbezogene Daten können gespeichert werden.

Ich hoffe meine Frage wird nicht genau so in dem Video beantwortet. Wie gesagt, ich werde das Video heute Abend nachholen.

Danke

21.03.2016 - 11:39 Uhr

Hallo zusammen,

ich bräuchte nochmal eure Hilfe/Erfahrung bezüglich Asp.net Core 1.

Es gibt zurzeit eine Web Api die von verschiedenen Clients genutzt wird (Browser, App, Desktop Client).

Da vor allem bei der App mit Tokens am besten gearbeitet werden kann, basiert die Authentifizierung auf Bearer-Tokens. Der AuthorizationServer wurde scheinbar nicht nach Asp.net Core 1 portiert.

Zurzeit ist der Ablauf: Benutzer sendet Daten per Post an /token. Eine Implementierung des OAuthAuthorizationServerProvider nimmt die Anfrage entgegen. In einer DB wird geguckt ob der Benutzer existiert. Daraufhin wird eine ClaimsIdentity angelegt mit ein paar Benutzerbezogenen Daten. Außerdem wird dem Client etwas zurück gegeben. Es wird nicht mit EF gearbeitet und der Authorizationserver ist nicht ausgelagert.

Zurzeit ist es so, dass der Benutzer jeden Controller nutzen darf, sobald er Authentifiziert ist. (Etwas anderes ist auch nicht geplant)

In Asp.net Core 1 gibt es nun den neuen Identity-Server 4 und zum Beispiel den OpenIdConnect Server.

Welcher weg ist nun der Richtige um die Authentifizierung zur portieren? OpenID Connect fühlt sich vertrauter an. Aber wirklich eindeutige Antworten für mein Vorhaben habe ich leider noch nicht gefunden.

Vielen Dank

18.03.2016 - 14:03 Uhr

Danke erstmal für den Überblick. Ich hatte mich einfach gewundert, warum Applikationen wir Skype, WhatsApp usw. durch die Firewall kommunizieren können, ohne explizit was freizugeben (in der Hardwarefirewall). Viele andere Anwendungen müssen erst freigegeben werden, bis diese nach außen dürfen.

Ich werde mich weiter einlesen. Danke.

18.03.2016 - 12:32 Uhr

Vielen Dank erstmal für die Antwort. Ehrlich gesagt ist es kein existierendes Projekt oder akutes Problem.

Das Gespräch entstand aus folgendem Grund: Es gibt ein Dienst der andere Dienste überwacht: Dieser kommuniziert nach draußen und liefert den Status. Es müssen immer Firewallregeln angelegt werden. Sobald sich aus irgendeinem Grund die IP des Rechners ändert oder sonst was, greift die Regel der Hardwarefirewall nicht mehr und es muss neu eingerichtet werden.

Das ändern der IP ist nur ein Beispiel, man kann hier natürlich vorbeugen, allerdings kommt es trotzdem immer mal wieder zu dem Problem bei Kunden.

Das heißt Websockets haben das Problem in der Regel nicht?

Ich hatte mal gelesen, dass die Websockets kein Problem beim Verbindungsaufbau haben, da dieser quasi der HTTP-3 Way-Handshake ist. Alles was danach kommt, könnte aber zu Problemen führen.

EDIT: Ich werde mich weiter einlesen.
EDIT2: Im Browser wird für Websockets normalerweise port 80/443 genutzt? Daher wird es dort keine Probleme geben. Aber als Desktop-Client sieht das ganze wahrscheinlich schon wieder anders aus, nehme ich an

18.03.2016 - 11:40 Uhr

Hallo zusammen,

mich würde mal interessieren, was das übliche vorgehen ist, um durch eine Firewall zu kommunizieren. Als Beispiel SignalR, bzw. Websockets. (Gerne auch andere Technologien)

Muss Clientseitig immer eine Firewall-Regel eingerichtet werden, oder kann dies umgangen werden?
Verwendet jemand von euch auf Kundensystemen Ports wie 80 oder 443?

Wie ist es mit Hardwarefirewalls? Wir sitzen zum Beispiel hinter einer Sophos-Firewall, aber Programme wie Skype, WhatsApp gehen ohne Probleme durch. (Es gibt ein abgeschottetes Testnetzwerk). Regeln wurden nicht extra angelegt. Kommt es hier auf die Aggressivität der Firewall an? Stateful Packet Inspection (Ja/Nein) usw.?

Vielleicht habt ihr ja ein paar Stichwörter nach denen man gezielt suchen kann.

Danke

17.03.2016 - 15:18 Uhr

Über


 services.AddTransient<ITest, Test>(serviceProvider =>
            {
                IHttpContextAccessor contextAccessor =               serviceProvider.GetService<IHttpContextAccessor>();
//usw.....

}

bekommt man den HttpContext. Das reicht mir. Nach ersten Tests funktioniert es problemlos.

16.03.2016 - 14:39 Uhr

Hallo zusammen,

ich hätte eine kurze Frage bezüglich der Dependency Injection. Das Projekt ist eine Web Api auf Basis von Asp.Net Core 1 (RC 1).

Gibt es einen Ansatz um Implementierungen zur Laufzeit zu tauschen?

Hierbei geht es nicht um die "FirstLevel" Injection.

Service x ist Interface x zugeordnet. Service x möchte einen Service nutzen der Interface y implementiert. Unter bestimmten Umständen soll er Klasse y oder eben Klasse y1 bekommen.

Etwas in der Art.


  services.AddTransient<ITest,Test>(serivceprovider =>
            {
                IF ----------
                return new Test(Klasse y);
                else
                return new Test(Klasse y1);
            });     

Bekommt man hier vielleicht die angefragte URL mit, oder welcher Controller angefragt wurde?
Kann man den Header des Requests an dieser Stelle auswerten?

Ist diese Möglichkeit überhaupt vorgesehen, oder gibt es andere Wege?

Vielen Dank

15.03.2016 - 13:00 Uhr

Dann wird es darauf hinauslaufen. Vielen Dank

15.03.2016 - 12:49 Uhr

Genau Coffeebean, danke 😃

Wahrscheinlich könnte ich im Header irgendein Flag mitsenden, um zu wissen welche DB gewünscht ist, aber so richtig kommt mir das auch nicht vor.

15.03.2016 - 11:47 Uhr

Danke erstmal für die Antworten.

Nicht der User direkt wählt aus, sondern die jeweilige Client-Anwendung.

Anwendung 1 --> DB1
Anwenung 2 --> DB2

Der Rest ist identisch.

Zurzeit ist der Authorization-Server nicht ausgelagert. Das sollte Allerdings kein Problem darstellen.
Da die Logik gleich ist und sich nur der Connection-String ändert, würde ich auch gerne bei einem Authorization-Server bleiben.

Hättet ihr vielleicht einen Tipp, wie das ganze bewerkstelligt werden kann?

15.03.2016 - 11:19 Uhr

Hallo zusammen,

ist es möglich unter bestimmten Umständen die Autorisierung auf einer 2ten Datenbank zu machen?

Verwendet werden die BearerToken über OAuth2.

Zum Beispiel über einen Parameter im TokenEndpointPath, oder einen 2ten Endpoint?

Gegen welche Datenbank autorisiert werden soll, entscheidet der Client.

Leider habe ich bisher keine Hinweise dazu gefunden.

Danke euch 😃

EDIT: Theoretisch muss nur die Datenbank-Connection ausgetauscht werden, der Rest ist identisch.

26.02.2016 - 15:18 Uhr

Vielen Dank für die Antworten. Sieht soweit gut aus. Danke

26.02.2016 - 10:39 Uhr

Hallo zusammen,

ich hätte eine kurze Frage.

IST-Zustand: Netzwerkdrucker ist über Lan direkt ans Netzwerk angeschlossen. Es sollen relativ viele Clients aus einem Programm darüber drucken können.

Muss der Drucker erst überall installiert werden? Hin und wieder kommen Arbeitsplätze hinzu und der Übergang wäre natürlich nicht gerade reibungslos, wenn erst die IT aktiv werden muss.

Ist es möglich auf diesem Drucker zu drucken, ohne das dieser unter Windows installiert ist?

IP ist statisch und bekannt. Es muss lediglich ZPL übertragen werden.

Annahme: Ich kann eine Verbindung zur IP aufbauen und die ZPL hinschicken. Gibt es alternativen oder hat jemand Erfahrungen?

Danke

10.02.2016 - 12:12 Uhr

Danke du hast Recht. Definitiv die bessere Lösung!

10.02.2016 - 11:24 Uhr

Hallo zusammen,

ist es möglich in einem String alle Wörter beginnend mit einem @ zu extrahieren? Die Wörter enden mit einem Komma oder einem Leerzeichen. Enthalten sein kann a-zA-Z oder ein _.

Ich habe mit einem Regex-Tester mal ein bisschen rumprobiert, bin aber bisher zu keiner Lösung gekommen.

Mit "@([_a-zA-Z]+)" erhalte ich das was ich möchte, allerdings immer nur das erste Wort

Könnte mir jemand noch einen Tipp geben, wie ich wirklich alle Wörter extrahieren kann?

Danke

EDIT:
Wenn man den (g)lobal mode nimmt, dann klappt es auch....

Danke

21.01.2016 - 11:32 Uhr

Danke erstmal für eure Unterstützung. Scheint ein sehr leidiges Thema zu sein.
Wir werden das intern nochmal diskutieren und dann hoffentlich zur "besten" Lösung kommen.

21.01.2016 - 10:03 Uhr

Soweit ich weiß, dienen die Cache-Manifeste dazu, um Webanwendungen offline verfügbar zu machen. Allerdings werden ich über JavaScript oder HTML5 wahrscheinlich keinen Drucker suchen und ansprechen können, oder irre ich mich?

Gibt es dazu eine Möglichkeit, die Browser unabhängig aus dem Browser heraus gestartet werden kann? Der Zugriff auf den Drucker erfolgt ohne Printwindow da es sich um Barcodes handelt.

Danke

21.01.2016 - 09:39 Uhr

Hallo zusammen,

da Chrome und Firefox(in naher Zukunft) den NPAPI Support über Bord werfen oder schon über Bord geworfen haben, wollte ich mal wissen, wie die alternativen aussehen.

Java Applets haben natürlich nichts mit .Net zutun, aber ich hoffe es ist in Ordnung hier trotzdem mal zu Fragen.

Zurzeit wird das Java Applet Clientseitig eingesetzt, um Barcodes aus dem Browser heraus zu drucken. Es muss nur dafür gesorgt werden, dass Java auf dem Client installiert ist. An das Applet werden dann bestimmte Parameter gegeben und entsprechend verarbeitet. Laufen muss das ganze zusammen mit dem IIS.

Ich habe schon mal Richtung Java Webstart und Microsoft ClickOnce gesucht. Die letzte Alternative wäre ein eigener Dienst der beim Client laufen muss und dann über Javascript angesprochen wird.

Habt ihr da schon Erfahrungen gemacht?
Wie sieht es mit dem Support von Applets und IE aus? Soweit ich weiß, läuft das über ActiveX. Ich habe allerdings nirgendswo gefunden, ob der Support von Java Applets bestehen bleibt im IE.

Danke euch

19.01.2016 - 12:42 Uhr

Um hier einfach nochmal einzuhaken:

So eine Verwaltung wie sie vom TE angesprochen wird, macht natürlich nur Sinn, wenn man die Daten wieder entschlüsseln kann. Es muss also der Schlüssel gespeichert werden.

Wie ist hier das sicherste Vorgehen? Tatsächlich in den Code schreiben und "obfuscaten"?

24.12.2015 - 14:58 Uhr

Hallo zusammen,

ist es möglich eine Doubleanimation aus dem C# Code heraus zu stoppen?
Ich habe gelesen es soll möglich sein BeginAnimation erneut aufzurufen und die Animation so zu "nullen". An sich stoppt die Animation auch, aber es scheint als würde die AnimationClock weiterlaufen und daraufhin wird das completed event gefeuert.

Kann man dies Unterbinden?

Danke

24.12.2015 - 10:48 Uhr

So einfach kann es sein. Danke 😃

23.12.2015 - 18:29 Uhr

Hallo zusammen,

ich würde aus einem ViewModel gerne ein Fenster öffnen, ohne etwas über das Fenster wissen zu müssen. Ich lege dafür ein Datatemplate für ein ViewModel an und ein Service kümmert sich um den Rest (nimmt das VM entgegen, weißt den Content des neuen Windows zu usw.)


    <Application.Resources>
        <DataTemplate DataType="{x:Type local:TestViewModel}">
            <local:TestView/>
        </DataTemplate>
    </Application.Resources>

Service:



    Window window = new Window();
    window.Content = viewModel;
    //usw.

So kann ich anhand des ViewModels ein Fenster öffnen lassen und wie das Fenster aussieht, wie es heißt, usw. ist dabei völlig unabhängig.

Mein Problem ist, das dass Fenster zu groß ist. Ich würde das Fenster gerne automatisch an die Größe des UserControls (local:TestView) anpassen.

Kann ich aus dem Code heraus Zugriff auf das UserControl über das ViewModel erlangen oder gibt es bessere Möglichkeiten um das Problem zu umgehen?

Danke

02.12.2015 - 16:30 Uhr

Unser Datenbankserver war ausgelastet und deswegen dauerten die Abfragen länger....
Dies ist mir leider nicht sofort aufgefallen, da ich keinen Vergleich zu den SQL-Abfragen hatte und ich den Fehler im Code gesucht habe.
Der Profiler hat mich aber in die richtige Richtung gestoßen.

Danke für die Hilfe.

02.12.2015 - 10:29 Uhr

Hallo zusammen,

ich habe gestern unter anderem den Datenbankzugriff in eine eigene dll ausgelagert. Stellenweise sind meine Requests nun fast doppelt so lang (von 100 - 150 ms auf 300ms).

Hat dies mit der ausgelagerten dll zutun oder muss ich an anderer Stelle suchen?

Falls es mit der dll zutun hat, kann man das Problem lösen und die Struktur beibehalten?

Danke

23.11.2015 - 06:42 Uhr

Standard liegt bei ca. 15.6 ms für den Timer unter Windows
http://stackoverflow.com/questions/3744032/why-are-net-timers-limited-to-15-ms-resolution

Ich nehme an, dass geht bei dir in die Richtung

28.10.2015 - 09:30 Uhr

Danke euch nochmal für die Hinweise. Es handelt sich "nur" um ein privates Projekt, deswegen kam ein teures Reportingtool nicht in Frage.

27.10.2015 - 13:15 Uhr

Ich bin gerade von Razor auf die RazorEngine gestoßen. Dies sieht sehr gut aus.

Edit: Danke Abt. Dann wird es die RazorEngine.

27.10.2015 - 13:09 Uhr

Hallo zusammen,

ich bin momentan auf der Suche nach einer Möglichkeit eine Auswertung im HTML-Format zu erstellen. Dabei sollen wie bei einer Templateengine Variablen dynamisch ersetzt werden, Zeilen in einer Tabelle anhand einer Auflistung erstellt werden usw.
Man kann es natürlich zu Fuß machen, dies wäre aber eher unhandlich und für außenstehende auch nicht so transparent wir ein Template.

So wie ich das sehe, wäre es mit T4 möglich. Gibt es noch andere Möglichkeiten, oder bereits etablierte librarys die ich nicht gefunden habe?

Danke euch.

EDIT: Oder sollte in diesem Fall direkt Razor verwendet werden? (Desktopanwendung)

21.10.2015 - 10:57 Uhr

Alles klar, danke euch

21.10.2015 - 09:10 Uhr

Danke erstmal für den Link, ich bin so nochmal auf meinen eignen Thread gestoßen der da verlinkt war.

Ich tendiere zu Nlog. Nlog hat zwar (ohne mich jetzt schon tiefer damit beschäftigt zu haben) die Möglichkeit asynchron zu loggen, mir geht es aber auch um den Teil der vorher passieren muss.
Im Sql Befehl die ganzen Parameter ersetzen, es müssen noch einige sonstige Variablen "zusammengesucht werden" und erst dann kommt das Loggen. Wahrscheinlich sprechen wir nur von einem recht kurzem Zeitverlust, aber mir würde es besser gefallen, würde es eine Zentrale Anlaufstelle geben, in die ich quasi nur meine "Aufträge" einfügen und niemand darauf warten muss.

Ich habe es jetzt so verstanden, dass erstmal nichts gegen mein vorhaben spricht?

20.10.2015 - 19:42 Uhr

Hallo zusammen,

ich hätte nochmal eine Fragen zum Loggen eines abgesetzten SQL-Befehls.

Zurzeit wird der SQL-Befehl abgesetzt und danach von Hand nochmal zusammengesetzt (Parameter ersetzt) und geloggt. In der Zeit wo der SQL-Befehl zusammengebaut und geloggt wird, muss der Benutzer natürlich noch auf die Response der Web Api warten.
Da im Asp.Net Bereich nicht "sinnlos" Threads erstellt werden sollte, würde ich gerne wissen, ob in diesem Fall ein Producer-Consumer Pattern Sinnvoll wäre.

Ich denke es würde ein Task reichen, der die Queue abarbeiten würde.

Gibt es ein besseres vorgehen, oder habt ich vielleicht sogar ein Beispiel?

Danke

EDIT: Es wird nicht das EF genutzt. Daher wird der Befehl für das Loggen nochmal von Hand zusammengesetzt.

13.10.2015 - 14:02 Uhr

Dein Codeausschnitt zeigt keine Textbox, sondern ein Event einer Textbox. Coffeebean hat dir schon gesagt, wie du es lösen solltest.

Deine Datenbank klasse sollte die Form nicht kennen müssen und auch nicht die Textbox. Die Kommunikation sollte anders herum funktionieren.

Erstelle dir eine Form mit deiner Textbox und zum Beispiel einem Button. In dem Button_Click Event (doppelt auf den Button klicken im WYSIWY-Editor) übergibst du dann den Wert der Textbox an die Datenbank klasse.


public class Datenbank
{

      public void Insert(string textboxvalueausderform){
           //Insert mit Value
      }
}

12.10.2015 - 09:03 Uhr

Alles klar, dann wird es so umgesetzt. Danke euch.

11.10.2015 - 15:19 Uhr

Danke dir auch nochmal für den Beitrag.

Wie genau würdest du denn das Hosting unter IIS aufbauen? Wenn du sagst zwei unterschiedliche Endpunkte, meinst du damit, das Frontend und Backend eine eigene Site im IIS bekommen? Demnach müsste die Web.Config nur im Frontend angepasst werden.
Oder verstehe ich dich falsch?

11.10.2015 - 12:56 Uhr

Hallo,

das Problem ist nicht, dass die Informationen verloren gehen, sondern es wird versucht die URL auf das Dateisystem zu mappen und das geht schief (404). Ich hätte sagen sollen, dass der HTML 5 Mode aktiviert ist, habe aber leider selber nicht daran gedacht. Ohne HTML 5 Mode würde soweit ich weiß nur die URL bis zum Hashbang auf das Dateisystem bezogen. Hier nachzulesen http://stackoverflow.com/questions/16569841/angularjs-html5-mode-reloading-the-page-gives-wrong-get-request

Ich werde die Anwendung nun erstmal in 2 Projekte teilen und versuchen das ganze unter dem IIS zu hosten. Bei Problemen melde ich mich nochmal.
Danke

10.10.2015 - 19:22 Uhr

Hallo und auch dir danke für deine Hilfe.

Ich werde die Anwendung nun auf 2 Projekte aufteilen. Nur nochmal um sicher zu gehen. Angularjs übernimmt das Routing Clientseitig. Ich hatte aber zum Beispiel bei einem Page refresh das Problem, dass die URL auf das Server Verzeichnis gemappt wurde und dort natürlich nichts gefunden wurde. Deswegen hatte ich die Web.config angepasst und es funktionierte auch ohne Probleme. Ist dies das falsche vorgehen, oder hatte ich das Problem nur, weil ich einen Fehler gemacht habe?

10.10.2015 - 16:32 Uhr

Die Solution besteht nur aus der Asp.Net Web Api + Angularjs.
Das heißt du würdest 2 Projekte daraus machen? (Frontend und Backend)
Falls ja, wie würde das Hosting unter IIS aussehen? Beide Projekte bekommen im IIS eine eigene "Seite" und eigenen Port?

Danke für deine Mühe

10.10.2015 - 14:44 Uhr

AngularJS dient als Frontend und die Web Api als Backend. Bei einem PageRefresh wurde auf der Serverseite nach der URL gesucht und natürlich nicht gefunden. Deswegen habe ich die Reweriteregeln eingebaut.

Der CodeDom Eintrag muss automatisch erzeugt worden sein. Ich war es auf jeden Fall nicht bewusst.

IIS Rewrite ist installiert und die Regeln werden in dem Modul aus der Webconfig auch richtig angezeigt.

Mir wird nun der folgende Fehler ausgegeben:

Dieser Konfigurationsabschnitt kann in diesem Pfad nicht verwendet werden. Dies ist der Fall, wenn der Abschnitt auf übergeordneter Ebene gesperrt ist. Die Sperrung erfolgt standardmäßig (overrideModeDefault="Deny") oder wird explizit mit einem location-Tag mit overrideMode="Deny" oder der Legacyeinstellung allowOverride="false" festgelegt.

Angegeben wird der handlers Bereich.


  20:   <system.webServer>
   21:     <handlers> <---- Rot hervorgehoben
   22:       <remove name="ExtensionlessUrlHandler-Integrated-4.0" />

Ich habe bereits einige Lösungsansätze im Internet gefunden und werde diese erstmal durchprobieren.

10.10.2015 - 13:41 Uhr

Hallo zusammen,

ich hätte nochmal eine Fragen zum Hosting unter IIS.

Ich habe über Visual Studio die Web Api veröffentlicht und im IIS eingehangen.

Ich bekomme allerdings beim Zugriff den Fehler

Fehlermeldung:
HTTP-Fehler 500.19 - Internal Server Error
Auf die angeforderte Seite kann nicht zugegriffen werden, da die zugehörigen Konfigurationsdaten für die Seite ungültig sind. HRESULT: 0X8007000D

Der Fehlercode ist einfach zu verstehen und HRESULT: 0X8007000D soll wohl heißen, dass die Web.config ein ungültiges XML Zeichen enthält.

Unter Visual Studio läuft allerdings alles Problemlos. Ich finde den Fehler daher einfach nicht.

Vielleicht könnte ja nochmal ein von euch ein Auge auf die Datei werfen:


<?xml version="1.0" encoding="utf-8"?>
<!--
  Weitere Informationen zum Konfigurieren Ihrer ASP.NET-Anwendung finden Sie unter
  http://go.microsoft.com/fwlink/?LinkId=301879
  -->
<configuration>
  <appSettings />
  <!--
    For a description of web.config changes see http://go.microsoft.com/fwlink/?LinkId=235367.

    The following attributes can be set on the <httpRuntime> tag.
      <system.Web>
        <httpRuntime targetFramework="4.5" />
      </system.Web>
  -->
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
  </system.web>
  <system.webServer>
    <handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
    <rewrite>
      <rules>
        <rule name="AngularJS Routes" stopProcessing="true">
          <match url=".*" />
          <conditions logicalGrouping="MatchAll">
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
            <add input="{REQUEST_URI}" pattern="^/(api)" negate="true" />
            <add input="{REQUEST_URI}" pattern="^/(templates)" negate="true" />
            <add input="{REQUEST_URI}" pattern="^/(authtoken)" negate="true" />
          </conditions>
          <action type="Rewrite" url="/Index.html" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
  <connectionStrings>
    <add name="***" connectionString="***" />
  </connectionStrings>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Cors" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" />
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
    </compilers>
  </system.codedom>
<system.data>
		<DbProviderFactories>
			<remove invariant="FirebirdSql.Data.FirebirdClient" />
			<add name="FirebirdClient Data Provider" invariant="FirebirdSql.Data.FirebirdClient" description=".NET Framework Data Provider for Firebird" type="FirebirdSql.Data.FirebirdClient.FirebirdClientFactory, FirebirdSql.Data.FirebirdClient" />
		</DbProviderFactories>
	</system.data>
</configuration>

Ich hoffe ihr habt einen Tipp.

Danke

06.10.2015 - 15:42 Uhr

Alles klar, vielen Dank

06.10.2015 - 15:24 Uhr

Danke erstmal für deine Antwort. Es hört sich so an, als würdest du IHttpActionResult vorziehen.
Spricht denn etwas dagegen, dass Objekt direkt zurückzugeben und dann die Statuscodes mit HttpResponseException zu erstellen? Gibt es vielleicht Vor und Nachteile außer der Testbarkeit?

06.10.2015 - 15:04 Uhr

Hallo zusammen,

ich hätte nochmal eine Frage bezüglich den unterschiedlichen Returntypes der Web api, die da wären:

HttpResponseMessage
IHttpActionResult
void
Irgend ein anderer Typ der direkt serialisiert wird

Es geht nun darum ein Objekt/Auflistung von Objekten als JSON zurückzugeben, oder eventuelle Errors. Welcher dieser Möglichkeiten (ausgenommen void) eignet sich am besten?

Bei IHttpActionResult wird über ExecuteAsync eine HttpResponseMessage erstellt. Die Testbarkeit ist dank des Interfaces besser. Zusätzlich hat man die Möglichkeit über

NotFound(); 

usw. Statuscodes zurückzugeben.

Gibt man das Objekt direkt zurück, wird es über den Mediaformatter serialisiert. Standard ist Statuscode 200. Über die HttpResponseException kann man Errorcodes generieren.

Außerdem hat man die Möglichkeit über den ExceptionHandler unbehandelte Exceptions abzufangen und zu behandeln.

Wann bietet sich welcher Returntype an? Habt ihr Erfahrungen und könntet mir ein paar Tipps geben, damit ich mir für die Zukunft kein Bein stelle?