Laden...

Forenbeiträge von schuppsl Ingesamt 789 Beiträge

17.10.2019 - 10:44 Uhr

Also in der Startup.cs:


 services.AddCors(options =>
            {
                options.AddPolicy("AllowAllHeaders",
                      builder =>
                      {
                          builder.AllowAnyOrigin()
                                 .AllowAnyHeader()
                                 .AllowAnyMethod();
                      });
            });
 

und

app.UseCors("AllowAllHeaders");

Das wäre dann das nächste Problem, was zu lösen wäre.
Bei der GET Anfrage kommt kein 405, aber auch die CORS Meldung.

Also erst einmal die 405er, für die ich immer noch keine Lösung gefunden habe.

17.10.2019 - 09:03 Uhr

Hallo zusammen.

Ich habe einen einfachen Core3.0 WebService erstellt, der einen POST entgegennimmt und ein paar Daten in eine Datenbank schreibt.

Mit Postman getestet, funktioniert es prima.
Soweit schon mal gut.

Aber das Ganze soll dann in einer Stinknormalen Webanwendung (Html+JQuery) ablaufen.
Also eine einfache HTML Webseite erstellt und das bischen JavaScript Code eingebaut, anlehnend an bereits vorhandene Projektchen.

Es kommen folgende Fehlermeldungen auf der Entwicklerkonsole im Webbrowser:> Fehlermeldung:

Failed to load resource: the server responded with a status of 405 (Method Not Allowed)
Login?ReturnUrl=%2F:1 Access to XMLHttpRequest at 'http://localhost:52373/api/SetELearnings' from origin 'https://localhost:44315' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Der JavaScript Code sieht so aus:


 <script>
     var request =
            {
         "method": "POST",
         "async": true,
         "crossDomain": true,
        "processData": false,
                "headers": {
                    "Content-Type": "application/json", 
                },
                "url":"http://localhost:52373/api/SetELearnings",
                "data": { "Modul"	: "Modulname","PersNr":"1234567","AbschlussDatum":"2014-01-01T23:28:56Z","Bemerkung":"Testeintrag" }
            }

$.ajax(request).done(function (response) {
  console.log(response);
});

    </script>

Der Controller des Webservice so:


 [Route("api/[controller]")]
    [ApiController]
    public class SetELearningsController : ControllerBase
    {
        private readonly CaptivateContext _context;

        public SetELearningsController(CaptivateContext context)
        {
            _context = context;
        }

........

 [HttpPost]
        public async Task<ActionResult<ELearning>> PostELearning(ELearning eLearning)
        {
            _context.ELearning.Add(eLearning);
            await _context.SaveChangesAsync();

            return CreatedAtAction("GetELearning", new { id = eLearning.Id }, eLearning);
        }

Ich habe schon mehrere Webservices im Einsatz, aber keiner mit Core3.0.
Also nehme ich an, dass es irgendwie daran liegen muss?

Dasselbe übrigens, wenn ich das auf dem Server im IIS veröffentliche, daher der Test erst einmal lokal.
Mit Postman geht es einwandfrei, also nehme ich an, dass es grundsätzlich funktioniert.
Selbst den Javascript Code vom Postman habe ich schon kopiert und versucht: dasselbe.

Was mache ich hier falsch?

10.10.2019 - 16:30 Uhr

Hello,

mal wieder ein DLL Problem - das möchte ich jetzt endgültig mal checken und in den Griff bekommen.

Also ich habe eine Windows Forms (.net 472) Anwendung, welche Funktionen von externen DLLs aufruft.
Extern bedeutet in diesem Falle, selbst programmiert.

Die externe DLL implementiert weitere, eigene DLL's. (Models etc)
Aus der externen DLL habe ich nun ein nuget Paket gemacht, welches dann in die Windows Anwendung von der lokalen nuget Source installiert wird.

Aktuell geht es um System.Interactive.Async

Diese ist abhängig vom EntityframeworkCore 2.2.4 und wird in der externen DLL mit diesem installiert.

Also externe DLL:
EntityFrameWorkCore2.2.4
System.Interactive.Async3.2.0

Wenn ich die externe DLL in meine Windows Forms Anwendung installiere, muss ich ja die beiden DLLs ebenfalls mit derselben Versionsnummer installieren.
Gesagt, getan.

Also externe DLL:
EntityFrameWorkCore2.2.4
System.Interactive.Async3.2.0

Forms Anwendung:
EntityFrameWorkCore2.2.4
System.Interactive.Async3.2.0

Auch in allen andere abhängigen DLLs:

EntityFrameWorkCore2.2.4
System.Interactive.Async3.2.0

Starte ich nun die Forms Anwendung und rufe die externe Funktion auf, dann:

Fehlermeldung:
{"Die Datei oder Assembly &quot;System.Interactive.Async, Version=4.0.0.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263&quot; oder eine Abhängigkeit davon wurde nicht gefunden. Die gefundene Manifestdefinition der Assembly stimmt nicht mit dem Assemblyverweis überein. (Ausnahme von HRESULT: 0x80131040)":"System.Interactive.Async, Version=4.0.0.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263"}

Ein Klassiker!

Also irgendwo wird nach der Version 4.0.0.0 gesucht und nicht gefunden.

Ich möchte die Ursache herausfinden.

Die steht in der InnerException:> Fehlermeldung:

=== Zustandsinformationen vor Bindung ===
LOG: DisplayName = System.Interactive.Async, Version=3.2.0.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263
(Fully-specified)
LOG: Appbase = file:///C:/Users/[user]/Documents/[Pfad]/Aufgabe1/bin/Debug/
LOG: Ursprünglicher PrivatePath = NULL
Aufruf von Assembly : Microsoft.EntityFrameworkCore, Version=2.2.4.0, Culture=neutral, PublicKeyToken=adb9793829ddae60.
===
LOG: Diese Bindung startet im default-Load-Kontext.
LOG: Die Anwendungskonfigurationsdatei wird verwendet: C:\Users[user]\D[Pfad]Aufgabe1\bin\Debug\Nasslack_Neu_Aufgabe_1.exe.Config
LOG: Die Hostkonfigurationsdatei wird verwendet:
LOG: Die Computerkonfigurationsdatei von C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config wird verwendet.
LOG: In der Anwendungskonfigurationsdatei wurde eine Umleitung gefunden. 3.2.0.0 wird nach 4.0.0.0 umgeleitet.
LOG: Verweis nach der Richtlinie: System.Interactive.Async, Version=4.0.0.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263
LOG: Die gleiche Bindung ist bereits aufgetreten und hat den Fehler hr = 0x80131040 verursacht.

Also, das ist doch die Lösung!
Prima.

Schaue ich in die App.config rein, dann steht da folgendes:

<dependentAssembly>
<assemblyIdentity name="System.Interactive.Async" publicKeyToken="94bc3704cddfc263" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>

Autsch.

Wahrscheinlich wurde diese Version irgendwann mal zum Projekt hinzugefügt.
Ich war ja der Meinung, dass in der Anwendungskonfigurationsdatei die Version angepasst wird, wenn ich eine niedrige Version installiere (die alte vorher deinstalliere) -vor allem wenn ich die als Abhängigkeit in einem eigenen (oder fremden) nuget Paket angebe - und zwar ganz genau in der Version 3.2.0.0 und nicht ≥ 3.2.0.0.

Aber jetzt kommt meine Frage:
Warum ist das nicht der Fall?
Ist die App.config rein mein Metier?
Ich habe das so mit Sicherheit nicht dort eingetragen....

Bitte nicht hauen.Vielen Dank.

09.10.2019 - 10:40 Uhr

Ok also ich habe nun zumindest mal für die beiden (SAP-) DLL's ein Nuget Package gemacht und installiere diese nun in Zukunft von einer lokalen nuget source.
Funktioniert prima, danke @T-Virus für den Hinweis.

Nach und nach werde ich dann die anderen, eigenen DLL's, teilweise mit Abhängigkeiten packen.
Somit sollte es DLL-Hell nicht mehr geben.

Mal wieder herzlichen Dank an die Profis hier!

09.10.2019 - 09:00 Uhr

Das ist wohl des Pudels Kern.
Und das ist wohl ein Grundsätzliches Problem, zumindest bei mir.

Ich habe mehrere selbst erstellte DLL#s mit Funktionen, die ich immer wieder benötige.
Hier verweise ich in den Projekten, direkt auf das Ausgabeverzeichnis der DLL-Projekte.
So muss ich bei Updates nicht immer die neu erstellten DLL's ins Projektverzeichnis kopieren.
Aber das ist wohl genauso "Banane?"
Was wäre hier die passende Vorgehensweise? (Ein Grundkurs im Programmieren ? )

08.10.2019 - 07:55 Uhr

@Abt:

Im Prinzip sieht es genau so aus, nur ist das Lib Verzeichnis außerhalb dieser Ordnerstruktur, da verschiedene Projekte auf dieses zugreifen.
Im Prinzip so:

Entwicklung\Lib\Sap\x32*.dll
Entwicklung\Lib\Sap\x64*.dll
Entwicklung\ProjektX
Entwicklung\ProjektX

So gibt es eine Stelle für die DLL's und jedes Projekt greift darauf zu.

Aber wie gesagt, ich binde weitere DLL's in die Webanwendung ein, welche diese DLL's benötigen. Deshalb werden diese auch mit eingebunden(oder?)

07.10.2019 - 16:53 Uhr

Vielen Dank.

Ok also ich habe mit der detaillierten Ausgabe den Fehler glaub schon gefunden.
Ich importiere einige andere DLL's die ich selbst erstellt habe ins Projekt.
In diesen werden die SAP-DLL's benötigt.

07.10.2019 - 16:45 Uhr

Hey,
vielen Dank.

Es handelt sich um DLL's von SAP, die die Konnektivität zu SAP bereitstellen.
Diese liegen einfach in einem von mit erstellten Verzeichnis und werden bei Bedarf in Projekte eingebunden.
Diese hatte ich im Projekt mal involviert, aber aus den Verweisen gelöscht, da ich das in diesem Projekt nicht mehr brauche.
Weder in irgendeiner .csproj, .comfig noch sonstwo ist noch ein Verweis auf diese DLLs vorhanden.
Trotzdem muss es ja irgendwo stehen, dass VS sagt "binde diese DLL's mit ein"...

07.10.2019 - 16:13 Uhr

Hallöle,

also ich zweifle ja mal wieder.
Ich habe ein ASP.NET MVC (.NET 4.7.2)Projekt in VS2019.

Mein Problem ist, dass ins Ausgabeverzeichnis lokal Debug/Release und beim Veröffentlichen zwei DLL's mitkopiert werden, die ich vor langer Zeit aus dem Verweis gelöscht habe.
Diese brauche ich nicht.

Ich habe schon alle möglichen Dateien im Projektverzeichnis durchsucht und im Gesamten Ordner in allen Dateien gesucht:
Es gibt genau Null Verweise auf diese beiden DLL's.
Im GAC sind sie auch nicht mehr (wurden gelöscht).

Trotzdem sind sie immer da.
Gibt es eine protokollierte Ausgabe des Kompliervorganges, damit ich sehen kann, woher die ungewünschten DLL's kommen?

Vielen Dank.

27.06.2019 - 11:29 Uhr

Nachtrag:

Die SignalR Funktionen müssen aus dem jquery.Ready() Block raus:

 $(function () {...});

Also außerhalb diesem sein.
Dann kann man auch meine o.G. Lösung weglassen.

Vor lauter Bäumen den Wald nicht gesehen.
Vielleicht hilft es ja irgendwann mal jemand.

27.06.2019 - 10:59 Uhr

Also ich habe mal das Clientseitige debugging eingeschalten:


  $.connection.hub.logging = true;

Darauf sehe ich im Browser den Fehler:> Fehlermeldung:

SignalR: No hubs have been subscribed to. The client will not receive data from hubs. To fix, declare at least one client side function prior to connection start for each hub you wish to subscribe to.

Nach diesem Fehler kann man schon mal besser googeln und ich bin dann auf diese Lösung gestoßen:
https://stackoverflow.com/questions/16248091/fail-to-initiate-connection-in-signal-r-in-asp-net

Sprich, irgendeine Funktion vor $.connection.hub.start().done bereitstellen, dann funzt das:


stocks.client.irgendwas = function() {};

Warum weiß ich nicht, aber so geht es.

27.06.2019 - 07:12 Uhr

Hallo zusammen,

wieder einmal stoße ich an die Grenzen von...keine Ahnung...mir selbst wahrscheinlich.
Auf einem Windows Server 2012 läuft per Windows Dienst ein SignalR Server.

Alles soweit wunderbar.

Auf der Clientseite habe ich einen Javascript Client der gleich nach dem Verbinden eine kurze "Hello from ...Client" Nachricht schickt.
Dies ist dann in der Entwicklerkonsole im Browser sichtbar.

Aber dies nur auf meinem Entwicklungsrechner.
Von jedem anderen Rechner aus geht es nicht.

Den aktuellen Dienst habe ich einem vorhandenen Dienst nachgebaut, der seit Jahren stabil läuft.

Der Dienst soll später Daten aus einer Datenbank zum Webbrowser schicken.

Ich kann weder auf der Server- noch auf der Clientseite einen Fehler entdecken.
Aber vielleicht stimmt ja mein Javascript Client nicht?
Es handelt sich um einen SignalR Server auf .Net 4.7.

Hier der Javascript Client:


 <script src="Scripts/jquery-3.4.1.js"></script>
    <script src="lib/signalr.js/jquery.signalR-2.4.1.js"></script>


    <script type="text/javascript" src="http://custom01.mein-server.de:8084/signalr/hubs"></script>

    <script type="text/javascript">
        $(function () {

             $.connection.hub.url = 'http://custom01.mein-server.de:8084/signalr';
           

            var stocks = $.connection.myHub;

            $.connection.hub.start().done(function () {


                stocks.server.sendTestMessage("Connected - Client Front");

                 $("#status").addClass("bg-success");

            }).fail(
  function(err) {
        console.error(err.toString());
        $("#status").addClass("bg-danger");
    }
);

            stocks.client.sendMessage = function (data) {
                console.log("data: " + data);
            };

Debugge ich im Browser das Script, kann ich erkennen, dass alle Scripte gefunden werden und der Hub auch erstellt wird.
Er springt also in den .done Bereich, ohne wirklich eine Verbindung zum SignalR Server herzustellen!
Das sehe ich im Debugger auf Server Seite

Das funktioniert nicht einmal direkt auf dem Server auf dem der SignalR Server läuft, sondern ausschließlich nur auf meinem Entwicklungsrechner.
Es ist auf dem SignalR Server keine Einschränkung oder ähnliches speziell auf meinen Rechner eingestellt!

Es kommen im Browser auch keinerlei Fehler (CORS o.ä.).

Die Webseite, die aufgerufen wird und den Javascript Client erstellt, liegt auf demselben Server wie der SignalR Server:
http://custom01.mein-server.de/view/front.html

Kann hier jemand einen Fehler entdecken?
Vielen herzlichen Dank im Voraus.

18.06.2019 - 07:30 Uhr

Musst du CORS noch für den Server anders konfigurieren?

Daran habe ich auch schon gedacht, aber das ist berücksichtigt.
Das Problem ist ja, dass erst gar keine Verbindung aufgebaut wird - bei CORS ist die Meldung in der Console des Browsers eine andere - im Moment kommt HTTP400.

Eigentlich kann es nur an irgendwelche Berechtigungen liegen...

Aber dann muss ich es halt doch wieder mit OWIN machen - da laufen bereits Dienste.

18.06.2019 - 07:04 Uhr

Und Du hast auf dem WebServer auch für den IIS das WebSocket Protokoll installiert (via Add Roles and Features).
Würde jetzt fast wetten, dass nicht 😉

Doch - extra nochmals nachgesehen.

Im Windows- oder ähnlichem Log ist nichts eingetragen.
Es handelt sich um eine Konsolen App und nicht eine klassische ASP.NET Anwendung...

17.06.2019 - 18:14 Uhr

Hallo zusammen.
Ich habe mal wieder was seltsames.

Ich habe eine .NET Core 2.2 Konsolenanwendung.

Diese implementiert einen Signalr Hub.

Dieser sieht so aus:


using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.IO;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.SignalR;
using System.Threading.Tasks;
using System.Collections.Generic;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http.Features;
using PulverService.Models;
using PulverService;

namespace SignalR_Server
{
   

    class SignalR
    {       

        public static void StartSignalR()
        {
            string signalRHost = "http://*:2222";
            var ConsOut = Console.Out;
            Console.SetOut(new StreamWriter(Stream.Null));
            Console.SetOut(ConsOut);

            var host = new WebHostBuilder()
                .UseKestrel()
                .UseStartup<Startup>()
                .UseUrls(signalRHost)
                .Build();


            try
            {
                host.Start();
             

            }
            catch(Exception ex)
            {
                string err = ex.Message;
                ConsoleLogger.PrintToConsole("SignalR Fehler: " + ex.Message, ConsoleColor.Red);
            }

            
            ConsoleLogger.PrintToConsole("SignalR Service erstellt auf Host: "+ signalRHost, ConsoleColor.Green);
        }
    }

    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddCors(options => options.AddPolicy("CorsPolicy", builder =>
            {
                builder
                    .AllowAnyMethod()
                    .AllowAnyHeader().AllowCredentials().AllowAnyHeader().WithOrigins("https://localhost:44304").WithOrigins("http://localhost:18577");

            }));

            services.AddSignalR();
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
            app.UseCors("CorsPolicy");
            app.UseSignalR(route =>
            {
                route.MapHub<MyHub>("/stream");
            });

            ConsoleLogger.PrintToConsole("SignalR Hub erstellt auf Hub: stream", ConsoleColor.Green);
           

        }
    }

    public static class UserHandler
    {
        public static HashSet<string> ConnectedIds = new HashSet<string>();
    }

    public class MyHub : Hub
    {

        /// <summary>
        /// Hier werden die Auftragsdaten von der manuellen Aufgabe empfangen
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public async Task SendAuftragsData( string[] data )
        {
            //Daten in SPS schreiben
             Program.sendAuftragsData(data);

        }

        public async Task SendViewDataManFront(SignalRViewDataManList dataMan)
        {
            await Clients.All.SendAsync("ReceiveViewDataFront", dataMan.ViewList);

        }

        public async Task SendViewDataManBack(SignalRViewDataManList dataMan)
        {
            await Clients.All.SendAsync("ReceiveViewDataBack", dataMan.ViewList);

        }

        public async Task SendMessage(string user, string message)
        {

            await Clients.All.SendAsync("ReceiveMessage", user, message);
            Console.WriteLine($"User: {user} says {message}");
        }

        public Task SendMessageToCaller(string message)
        {
            return Clients.Caller.SendAsync("ReceiveMessage", message);
        }

        public Task SendMessageToGroups(string message)
        {
            List<string> groups = new List<string>() { "SignalR Users" };
            return Clients.Groups(groups).SendAsync("ReceiveMessage", message);
        }

        public override async Task OnConnectedAsync()
        {
            await Groups.AddToGroupAsync(Context.ConnectionId, "SignalR Users");
            UserHandler.ConnectedIds.Add(Context.ConnectionId);
            Console.WriteLine($"Connected user: {Context.ConnectionId}");
            await base.OnConnectedAsync();
        }

        public override async Task OnDisconnectedAsync(Exception exception)
        {
            await Groups.RemoveFromGroupAsync(Context.ConnectionId, "SignalR Users");
            UserHandler.ConnectedIds.Remove(Context.ConnectionId);
            Console.WriteLine($"Disconnected user: {Context.ConnectionId}");
            await base.OnDisconnectedAsync(exception);
        }
    }
}


Starte ich die Anwendung auf meinem Entwicklungsrechner (Windows 10), dann sieht alles super aus.
Ich kann mich mit einem JavaScript Client auf den hub verbinden.

Zum Test, ob das generell funktioniert, kann ich im Webbrowser http://localhost:2222/stream angeben.
Hier kommt dann z.B. die Meldung "Connection ID required".

Exportiere ich das Projekt lokal auf meinem Rechner, starte die Konsolenanwendung funktioniert ebenfalls alles prima.

Exportiere ich das ganze auf den Server, wo es nachher laufen soll, geht es nicht.

Die Konsonenanwendung startet, der SignalR Hub wird initialisiert und alles sieht gut aus.
Mit TCPView (Sysinternals) sehe ich, dass die Anwendung auf den Port 2222 hört.

Nur kann ich mich weder lokal noch Remote mit dem Hub verbinden.
Im Webbrowser kommt immer Fehler 400 - Bad Request.

Ich habe schon verschiedene Server, Ports und Webbrowser ausprobiert. So war ein Windows Server 2012 und ein Windows Server 2016 (Datasenter) dabei
Es scheint nur auf meinem Entwicklungsrechner zu gehen.

Auf dem 2012er laufen viele Anwendungen, unter anderem ein Dienst, der SignalR Hubs und Clients bereitstellt. Allerdings mit .NET 4.7 und eine Asp.Net Core Webanwendung.

Hat jemand eine Idee, warum das auf dem Zielrechner nicht funktionieren könnte?
Vielen Dank im Voraus!

16.05.2019 - 10:23 Uhr

Hallo zusammen,

mal wieder habe ich ein Problem, was mich schon Stunden gekostet hat:
Ich habe ein ASP.NET MVC/ .NET 4.7.2 Projekt.
In dieses installiere ich EntityFrameWorkCore (2.2.4)

Bisher hat das einwandfrei funktioniert, auch mit Migrations usw.
Alles kein Problem.
Doch seit gestern ist es doch ein Problem.

Ich möchte eine neue Migration anlegen in der Konsole, da ich am Datenmodell was geändert habe. Dies soll nun in die DB übertragen werden.
Diesen Vorhang habe ich schon hunderte Male gemacht, kein Problem bisher:z.B.


add-migration AddSwitch

Dann kommt der Fehler in der Manager-Konsole:

Fehlermeldung:
System.IO.FileNotFoundException: Die Datei oder Assembly "Microsoft.Extensions.Configuration.Abstractions, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60" oder eine Abhängigkeit davon wurde nicht gefunden. Das System kann die angegebene Datei nicht finden.

Eigentlich eindeutig.

Schaue ich mal in die web.config:


 <dependentAssembly>
        <assemblyIdentity name="Microsoft.Extensions.Configuration.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.2.0.0" newVersion="2.2.0.0" />
      </dependentAssembly>


Also kein Problem.

Schaue ich in die packages.config:


<package id="Microsoft.Extensions.Configuration.Abstractions" version="2.2.0" targetFramework="net472" />

Also auch kein Problem.

Schaue ich in die Projekt.config:


<Reference Include="Microsoft.Extensions.Configuration, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
      <HintPath>..\packages\Microsoft.Extensions.Configuration.2.2.0\lib\netstandard2.0\Microsoft.Extensions.Configuration.dll</HintPath>
    </Reference>

Auch soweit gut, dann schaue ich mal in den \packages Ordner:
Der Ordner

Microsoft.Extensions.Configuration.2.2.0\lib\netstandard2.0\

existiert.
Darin befindet sich die DLL mit der korrekten Versionsnummer 2.2.0.

Schaue ich ins VisualStudio 2019 Ultimate:
In den Verweisen ist bei dieser DLL ein Ausrufezeichen.
Im \bin Verzeichnis ist diese DLL auch nicht vorhanden.

D..h. es gibt irgendwo eine Einstellung, die verhindert, dass verlinkte DLLs in den \bin Order kopiert werden.
Mache ich das manuell, funktioniert es (natürlich)
Lokale Kopie ist auf true.

Woran könnte dies noch liegen?

Vielen Dank im Voraus!

06.05.2019 - 08:47 Uhr

Alles klar, vielen Dank Euch allen!
👍

03.05.2019 - 07:46 Uhr

Also wenn ich es so mache, geht es:


builder
                    .AllowAnyMethod()
                    .AllowAnyHeader().AllowCredentials().WithOrigins("https://localhost:44304");

Allerdings muss ich den Port explizit mit angeben bei WithOrigins().


WithOrigins("https://localhost")

Funktioniert nicht, dann kommt die Fehlermeldung:

Fehlermeldung:
Access to XMLHttpRequest at 'http://localhost:5050/stream/negotiate' from origin 'https://localhost:44304' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

02.05.2019 - 15:09 Uhr

Hallo zusammen,

mal wieder wende ich mich in letzter Verzweiflung an Euch.
Ich habe einen selfhosted signalR Server (.Net CORE 2.2, Konsole App) aufgesetzt:


using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.IO;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.SignalR;
using System.Threading.Tasks;
using System.Collections.Generic;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http.Features;

namespace SignalR_Server
{
    class SignalR
    {
        public static void StartSignalR()
        {
            var ConsOut = Console.Out;
            Console.SetOut(new StreamWriter(Stream.Null));

            var host = new WebHostBuilder()
                .UseKestrel()
                .UseStartup<Startup>()
                .UseUrls("http://localhost:5050")
                .Build();

            try
            {
                host.Start();
               

            }catch(Exception ex)
            {
                string err = ex.Message;
            }

            Console.SetOut(ConsOut);
        }
    }

    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddCors(options => options.AddPolicy("CorsPolicy", builder =>
            {
                builder
                    .AllowAnyMethod()
                    .AllowAnyHeader().AllowAnyOrigin();
                    
            }));

            services.AddSignalR();
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
            app.UseCors("CorsPolicy");
            app.UseSignalR(route =>
            {
                route.MapHub<MyHub>("/stream");
            });

            
            
        }
    }

    public static class UserHandler
    {
        public static HashSet<string> ConnectedIds = new HashSet<string>();
    }

    public class MyHub : Hub
    {
        public async Task SendMessage(string user, string message)
        {
            await Clients.All.SendAsync("ReceiveMessage", user, message);
            Console.WriteLine($"User: {user} says {message}");
        }

        public Task SendMessageToCaller(string message)
        {
            return Clients.Caller.SendAsync("ReceiveMessage", message);
        }

        public Task SendMessageToGroups(string message)
        {
            List<string> groups = new List<string>() { "SignalR Users" };
            return Clients.Groups(groups).SendAsync("ReceiveMessage", message);
        }

        public override async Task OnConnectedAsync()
        {
            await Groups.AddToGroupAsync(Context.ConnectionId, "SignalR Users");
            UserHandler.ConnectedIds.Add(Context.ConnectionId);
            Console.WriteLine($"Connected user: {Context.ConnectionId}");
            await base.OnConnectedAsync();
        }

        public override async Task OnDisconnectedAsync(Exception exception)
        {
            await Groups.RemoveFromGroupAsync(Context.ConnectionId, "SignalR Users");
            UserHandler.ConnectedIds.Remove(Context.ConnectionId);
            Console.WriteLine($"Disconnected user: {Context.ConnectionId}");
            await base.OnDisconnectedAsync(exception);
        }
    }
}



Der Client ist ein reiner JavaScript Client:


...
  <script src="/lib/signalr/dist/browser/signalr.js"></script>
...
const connection = new signalR.HubConnectionBuilder()
    .withUrl("http://localhost:5050/stream")
    .configureLogging(signalR.LogLevel.Information)
    .build();

connection.start().catch(err => console.error(err.toString()));

Rufe ich die HTML Seite mit dem JavaScript auf, meckert der Chrome:

Fehlermeldung:
Access to XMLHttpRequest at 'http://localhost:5050/stream/negotiate' from origin 'https://localhost:44304' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.

signalr.js:2430 Error: Failed to complete negotiation with the server: Error
ConsoleLogger.log @ signalr.js:2430
(anonymous) @ signalr.js:2802
step @ signalr.js:2605
(anonymous) @ signalr.js:2586
rejected @ signalr.js:2578
Promise.then (async)
step @ signalr.js:2579
fulfilled @ signalr.js:2577
Promise.then (async)
step @ signalr.js:2579
(anonymous) @ signalr.js:2580
__awaiter @ signalr.js:2576
HttpConnection.getNegotiationResponse @ signalr.js:2773
(anonymous) @ signalr.js:2713
step @ signalr.js:2605
(anonymous) @ signalr.js:2586
step @ signalr.js:2590
(anonymous) @ signalr.js:2586
(anonymous) @ signalr.js:2580
__awaiter @ signalr.js:2576
HttpConnection.startInternal @ signalr.js:2681
HttpConnection.start @ signalr.js:2641
(anonymous) @ signalr.js:1761
step @ signalr.js:1708
(anonymous) @ signalr.js:1689
(anonymous) @ signalr.js:1683
__awaiter @ signalr.js:1679
HubConnection.start @ signalr.js:1750
(anonymous) @ site.js?v=bbSp_ES0ncqX_XK1MVLsTiU7kxXBi9bxmYSw_Kpyug8:11
signalr.js:2430 Error: Failed to start the connection: Error
ConsoleLogger.log @ signalr.js:2430
(anonymous) @ signalr.js:2763
step @ signalr.js:2605
(anonymous) @ signalr.js:2586
rejected @ signalr.js:2578
Promise.then (async)
step @ signalr.js:2579
(anonymous) @ signalr.js:2580
__awaiter @ signalr.js:2576
HttpConnection.startInternal @ signalr.js:2681
HttpConnection.start @ signalr.js:2641
(anonymous) @ signalr.js:1761
step @ signalr.js:1708
(anonymous) @ signalr.js:1689
(anonymous) @ signalr.js:1683
__awaiter @ signalr.js:1679
HubConnection.start @ signalr.js:1750
(anonymous) @ site.js?v=bbSp_ES0ncqX_XK1MVLsTiU7kxXBi9bxmYSw_Kpyug8:11
site.js?v=bbSp_ES0ncqX_XK1MVLsTiU7kxXBi9bxmYSw_Kpyug8:11 Error
(anonymous) @ site.js?v=bbSp_ES0ncqX_XK1MVLsTiU7kxXBi9bxmYSw_Kpyug8:11
Promise.catch (async)
(anonymous) @ site.js?v=bbSp_ES0ncqX_XK1MVLsTiU7kxXBi9bxmYSw_Kpyug8:11

Wie kann ich denn das lösen?

11.04.2019 - 12:18 Uhr

Au man 8o
Manchmal bin ich doch nicht zurechnungsfähig. Die letzte Installation ist wohl schon ne Weile her.
vielen Dank!

11.04.2019 - 11:58 Uhr

Hello together,

also ich habe einen neuen Rechner, sämtliche Projektordner kopiert und nun ein Projekt gestartet (VS2017 Enterprise):
VS motzt mich nun an, dass das Projekt nicht geladen werden kann da das Zielframework 4.7.1 nicht installiert sei.
Ich solle nun downgraden auf 4.6.1 oder 4.7.1 installieren.

Das ist aber installiert!
Schon mehrfach installiert, neu installiert und repariert.
Trotzdem wird das von VS nicht erkannt.
Auf dem alten Rechner kann ich brav 4.7, 4.7.1 und 4.7.2 auswählen.
Der alte ist Windows 8.1., der neue Windows 10.

Kann sich das jemand erklären?

10.04.2019 - 08:47 Uhr


>
oder Dependency Walker.

Vielen Dank.

Mein IHostedService hatte damals nach einiger Zeit (Monaten) irgendwelche komischen Sachen gemacht, deshalb bin ich wieder auf einen Service gegangen 😃

09.04.2019 - 14:45 Uhr

IHostedService kenne ich, hatte ich auch schonmal programmiert.
Fakt ist jedoch, dass ich das Ganze in einer "normalen" Windows Anwendung programmiert hatte, die prima läuft.
Und in einem anderen Dienst dasselbe, läuft ebenfalls.
Es kann sich nur um eine nicht kompatible Version irgendeiner DLL handeln - nur wie finde ich das heraus ohne Protokoll?

09.04.2019 - 14:04 Uhr

Hallo zusammen, ich bin mal wieder am Verzweifeln.

Ich habe schon viele stinknormale Windows-Dienste (.NEt 4.7.1) erstellt, aber der neue treibt mich in den Wahnsinn.
Ich binde eine DLL von einem Fremdhersteller ein (OPC) und rufe ein paar Funktionen auf.
sobald ich das mache, startet der Dienst nicht mehr.
Mach ich den Dienst wieder "nackig" geht's wieder.

Die DLL habe ich schon in einem anderen Dienst eingebunden, der funktioniert perfekt.
Seltsam ist auch, dass wenn ich irgendeine Funktion einbaue, auch wenn die gar nichts macht, dann geht es nicht mehr.

Das Problem wird nun sein, dass irgendwelche DLL Versionen nicht zueinander passen.
Nur wo sehe ich das?
Den Dienst kann ich lokal nicht debuggen, da dieser nicht einmal startet. (An den Prozess anhängen)

Im Ereignisprotokoll unter Windows-Anwendung steht nichts genaues drin.

Daher stelle ich mir die Frage:
Wo steht genau, das das Problem ist?

26.03.2019 - 10:29 Uhr

👍 👍 👍Viiiieeeelen Dank!

Das war es wohl 👍

26.03.2019 - 10:18 Uhr

Also ich möchte per Javascript/ajax Daten an den Controller übergeben.
Das sieht so aus:

var request =
        {
            "type": "POST",
            "url": "/Home/SetPulverData",           
            "data": "[{ 'IAufNr': '1111', 'IColor': 'Col1' },{'IAufNr': '2222',  'IColor': 'Col2' }]" 
        }
        
        $.ajax(request)
        .done(function (ergebnis) {

            if (ergebnis.success == true) {


            }
               
        })
        .fail(function (errMsg) {
            console.log(errMsg);
        })

Der Controller:

 [HttpPost]
        public ActionResult SetPulverData(IEnumerable<ColModel> myAuftraege )
        {



            return Json("");

        }

Das Model sieht so aus:

 public class ColModel
    {
        public int id { get; set; }
        public string IAufNr { get; set; }
        public string IColor { get; set; }
        public string  EColor { get; set; }
        public string ESonder { get; set; }
        public string  IWagenNr { get; set; }
        public string ERueckMldNr { get; set; }

    }

myAruftraege ist immer null, da kann ich machen was ich will.
Habe schon gegoogelt und alles Mögliche ausprobiert.

Mit dem Tool "Postman" funktioniert es aber seltsamerweise.
Schaue ich mir den Ajax Request von Postman an, sieht der so aus:


var settings = {
  "async": true,
  "crossDomain": true,
  "url": "http://localhost:18577/Home/SetPulverData",
  "method": "POST",
  "headers": {
    "content-type": "application/json",
    "cache-control": "no-cache",
    "postman-token": "9ee8b4cc-7bff-3f32-0425-244ecd03f466"
  },
  "processData": false,
  "data": "[\n\n{\n\t\"IAufNr\": \"1111\",\n\t\"IColor\": \"Col1\"\n},\n{\n\t\"IAufNr\": \"2222\",\n\t\"IColor\": \"Col2\"\n}\n\n\t\n]"
}

$.ajax(settings).done(function (response) {
  console.log(response);
});

Einziger Unterschied wäre die content-type Angabe.
Gebe ich die aber in meinem Script an, macht das aber keinen Unterschied und myAuftraege ist null.

Habe auch schon die Ausgabe von Postman in mein Script kopiert, myAuftraege ist null.

Kann jemand erkennen, an welcher Stellschraube es hier noch fehlt?

25.03.2019 - 09:59 Uhr

Also folgendes habe ich gemacht:

System.Net.Http aus den Verweisen gelöscht.
In der .csproj den Verweis darauf gelöscht
Den Ordner System.Net.Http.4.3.4 im Ordner packages gelöscht.
Per NuGet System.Net.Http installiert.

Die DLL zeigt jetzt zwar immer noch auf das MsBuild Verzeichnis, aber die Version stimmt jetzt und das ganze Läuft jetzt mal....

25.03.2019 - 09:00 Uhr

Hallo Schuppsl,

Die 4.2.ér Version scheint nicht von deinem Projekt, sondern von einem BuildTarget referenziert zu sein.

Ja, aber das Problem ist ja: Warum ist das so?

Edit.
Also das verstehe ich nicht:
Ich lösche die System.Net.Http aus den Verweisen.
Dann gehe ich in das Verzeichnis wie bei allen anderen:

C:\Users\MeinUser\Documents\Visual Studio 2017\Projects\MeinProjekt\Projekt.Sort.Solution\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll

Und füge diese aus diesem Verzeichnis hinzu.
Dann steht aber trotzdem wieder die Version 4.2.0.0 mit dem MSBuild Verzeichnis drin (Siehe Ausgangspost)

Wie kann denn das sein?

P.S. VS2017 ist auf dem aktuellsten Stand

22.03.2019 - 09:53 Uhr

Hallo Ihr beiden,
vielen Dank.
Leider jedoch hat das Löschen beider <private> Einträge nichts geholfen.

Die DLL existiert im angegebenen Pfad.

Zum Test habe ich mal im Projekt.Provider die System.Net.Http.DLL gelöscht und händisch vom o.G. Pfad wie in den anderen Projekten zugefügt.

Das löst das Problem leider auch nicht...weiß echt nicht mehr weiter.

Die Meldung in der Webanwendung:> Fehlermeldung:

Die Datei oder Assembly "System.Net.Http, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" oder eine Abhängigkeit davon wurde nicht gefunden. Die gefundene Manifestdefinition der Assembly stimmt nicht mit dem Assemblyverweis überein.

In der .csproj steht nun:

<Reference Include="System.Net" />
    <Reference Include="System.Net.Http, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll</HintPath>
    </Reference>
22.03.2019 - 07:39 Uhr

Hallo zusammen,

im Moment stecke ich in einer DLL Hell und weiß nicht wie ich da heraus komme.

Also ich habe mehrere Projekte, die aufeinander aufbauen:

Projekt.DomainModel
Projekt.Provider
Projekt.BusinesLayer (Projekt.BLL)

Alle drei Projekte bedarf die DLL des Vorgängers und wird per Reference eingebunden.
Also jeweils im Projekt=> Verweise.

Alle Projekte haben als Zielframework .NET 4.7, Plattformziel:Any und sind Klassenbibliotheken.

Am Ende wird die Projekt.BLL in eine weitere ASP.NET MVC5 Anwendung eingebunden.
Ebenfalls .NET 4.7, AnyCPU.

In der Webanwendung erstelle ich eine Klasse vom Typ Projekt.Provider.
An der Stelle kommt die Fehlermeldung, dass > Fehlermeldung:

System.Net.Http 4.2.0.0 nicht gefunden werden kann .

Hier habe ich mal aufgelistet, welches Projekt auf welche System.Net.Http referenziert.
Ich gehe dabei auf die referenzierte DLL im Projektmanager und dann auf Eigenschaften.
Alle System.Net.Http sind über Nuget, Version 4.3.4 eingebunden.

Projekt.DomainModel:
Version: 4.1.1.3
Pfad:
C:\Users\MeinUser\Documents\Visual Studio 2017\Projects\MeinProjekt\Projekt.Sort.Solution\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll

++
Projekt.Provider:++
Version: 4.2.0.0
Pfad:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\System.Net.Http.dll

++
Projekt.BusinessLayer++

Version: 4.1.1.3
Pfad:
C:\Users\MeinUser\Documents\Visual Studio 2017\Projects\MeinProjekt\Projekt.Sort.Solution\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll

Webanwendung:
Version: 4.1.1.3
Pfad:
C:\Users\MeinUser\Documents\MeinPfad\Entwicklung\WebProjekt\MeinProjekt\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll

Eigentlich ist der Fall glasklar:
Die System.Net.Http im Projekt Projekt.Provider referenziert nicht auf die Packages im Projektordner, sondern auf den lib Ordner.
Darum sucht die Webanwendung die Version 4.2.0.0, die natürlich sonst nirgends vorhanden ist.

Aber warum ist das so?
Ich installiere System.Net.Http immer über den Nuget Package Manager. Dieser macht das ja automatisch.

Wo kann hier eine Konfiguration anders sein?
Wie kann man so etwas in Zukunft vermeiden?

Nachtrag:

Vergleiche ich die .csproj Dateien der Projekt.BLL und Projekt.Provider sehe ich was erstaunliches:

Projekt:BLL:

<Reference Include="System.Net.Http, Version=4.1.1.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>..\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll</HintPath>
    </Reference>

Projekt.Provider:

<Reference Include="System.Net" />
    <Reference Include="System.Net.Http, Version=4.1.1.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>..\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>

Zumindest der HintPath ist derselbe.

22.02.2019 - 09:18 Uhr

Super, vielen Dank an alle! 👍

19.02.2019 - 10:46 Uhr

Hallo Gemeinde,

ich hätte mal wieder eine blöde Frage.
Man kann ja aus dem Internet z.B. Codeplex Beispiel Lösungen für Visual Studio herunterladen.
Öffnet man diese dann in VS, werden beim ersten kompilieren alle benötigten Pakete heruntergeladen.

Ich möchte nun auch eine Solution weitergeben.
Wie mache ich das, dass derjenige, der die Lösung entzippt und öffnet eine möglichst schlanke Datei bekommt?

Vielen Dank.

21.11.2018 - 12:14 Uhr

Hallo zusammen,

ich bin so vorgegangen wie hier beschrieben:
[Tutorial] Konfigurationsmodell im .NET Framework

Es handelt sich dabei um eine Windows Forms Anwendung mit .NET 4.7.
Veröffentlicht wird auf einen Server, damit ich von jedem Client aus die setup.exe ausführen und die App installieren kann.
Die App ist "online" und "offline" verfügbar.
Beim Start soll die Anwendung nach Updates auf dem Server suchen.

Ich starte also die Anwendung auf dem Client und ändere dann einen Wert.
Dieser wird auch gespeichert und dann angezeigt.

Nach der Einstellung hat der Benutzer die Möglichkeit, die Anwendung direkt neu zu starten, da diese Einstellung steuernde Funktionen hat und im Form_Load Event ausgewertet wird.

Per System.Reflection.Assembly.GetEntryAssembly().Location
ermittle ich die Location und starte dann die Anwendung neu.

Doch es scheint Unterschiede zu geben.
Wenn ich die Anwendung mit dem ermittelten Pfad neu starte, hat diese andere Einstellungen als wenn ich ins Startmenü gehe und diese dort starte.
Das im Startmenü ist eine .appref Datei.

Schaue ich in den Taskmanager ist die Location bei beiden diesselbe und auch die gleiche, welche o.G. Funktion ermittelt.
Soweit also gut.

Der Pfad: ...user\AppData\Local\Apps\2.0\Y8.....\kryptisches Zeug

Also der Pfad der beiden scheint gleich zu sein, aber die Usersettings unterschiedlich.

Wo befinden sich jeweils die Usereinstellungen?
Und warum ist das so?
Wie kann ich den Pfad zur appref Datei im Programm ermitteln?

Nachtrag: Den Pfad für die Usersettings der ClickOnce Anwendung habe ich so ermittelt:

ApplicationDeployment.CurrentDeployment.DataDirectory

Trotzdem frage ich mich, warum das zwei unterschiedliche usersettings sind?

Viele verwirrte Grüße und vielen Dank im Voraus

05.10.2018 - 16:20 Uhr

Vielen Dank für die konstruktiven Vorschläge.
Die werde ich mir nächste Woche mal überlegen....

05.10.2018 - 12:29 Uhr

Hallo zusammen,

mit dem Thema habe ich mich noch nie beschäftigt und habe keinerlei Ahnung, deshalb die Frage 😃

Wir haben folgendes vor:

Ein Client hat 2-3 Funk-Barcodeleser angeschlossen.
D.h. also da stecken 2-3 USB-Funk Empfänger drin.

Jetzt wird wild QR Code gescannt, der z.B. Materialnummern beinhaltet.

Diese gescannten Daten sollte ich nun auslesen, gleichzeitig mit der eindeutigen ID (oder was es da auch immer gibt) des Scanners.

Daten vom Barcodescanner in ein Textfeld lesen - kein Problem.
Das Programm sollte aber im Hintergrund laufen und auf sämtliche USB Barcodeleser lauschen.

Diese Daten sollten dann "aufgefangen" werden, kommen dann in eine Datenbank usw.

Am liebsten wäre es mir, wenn es eine Library gibt, die mir ein Event wirft, wenn was gelesen wird.
Allenfalls kann das auch irgendwo in einem Zwischenspeicher landen, Textdatei oder was auch immer.
Das ganze sollte zwar zeitnah, aber nicht in Echtzeit passieren.

Gibt es so etwas?
Darf auch was kosten... 😃

Vielen Dank für Anregungen.

24.09.2018 - 16:29 Uhr

Gesagt, getan.

Funktioniert prima, danke 👍

24.09.2018 - 09:46 Uhr

Hoi,

ich vermute mal, das fehlende Schlusszeichen ist nur ein Typo? 😉

Ja...
Habe es schon mit und ohne Domäne versucht, beider geht nicht.
Die Gruppe stimmt.
Habe mal gelesen, dass es so mit Gruppen gar nicht geht...muss aber nochmals genauer nachlesen.

Also es liegt nicht daran, dass in der web.config was falsch angegeben ist?

In der Funktion

FormsAuthentication

gebe ich ja den Username an, hier wird dan das Cookie entsprechend angelegt(?)
Im Controller gebe ich aber die Gruppe an.
Also müsste ich das Cookie auch mit der Gruppe anlegen?

24.09.2018 - 08:50 Uhr

Hallöle zusammen.

Ich habe hier eine "klassische" Asp.Net MVC 5 Anwendung bei der einzelne Seiten nur für bestimmte User sein sollten.
Für diese User wird eine neue Gruppe im Active Directory erstellt, damit neue User einfach hinzugefügt werden können.

Dabei soll es keine Hochsicherheits-Anwendung sein, Forms Authentifizierung mit Cookies macht man zwar nimmer, reicht hier aber völlig aus.
Alles bleibt intern.

Gebe ich im entsprechenden Controller die einzelnen Benutzer an, funktioniert es.
Bei den AD-Gruppen aber nicht.

So sieht der Quellcode aus:

Web.config

 <add name="ADConnectionString" connectionString="LDAP://Pfad zum AD" />

....
 <authentication mode="Forms">
      <forms name=".ADAuthCookie" loginUrl="~/Account/Login" timeout="45" slidingExpiration="false" protection="All" />     
    </authentication>
  
    <membership defaultProvider="ADMembershipProvider">
      <providers>
        <clear />
        <add name="ADMembershipProvider" type="System.Web.Security.ActiveDirectoryMembershipProvider" connectionStringName="ADConnectionString" attributeMapUsername="sAMAccountName"  connectionUsername="DOMÄNE\Benutezr" connectionPassword="PASSWORT"/>
      </providers>
    </membership>

Dann im Controller, so funktioniert es:


   
     [Authorize(Users="username")]
        public ActionResult Korrektur()
        {
...
}

So funktioniert es nicht:



  [Authorize(Roles = "DOMÄNE\\GRUPPE)]        
        public ActionResult Korrektur()
        {
           
        }

Die Login Form:


@using (Html.BeginForm(null, null, new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post))
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>Login</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <div class="form-group">
            @Html.LabelFor(model => model.UserName, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.UserName, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.UserName, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.Password, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Password, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Password, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.RememberMe, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                <div class="checkbox">
                    @Html.EditorFor(model => model.RememberMe)
                    @Html.ValidationMessageFor(model => model.RememberMe, "", new { @class = "text-danger" })
                </div>
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Log In" class="btn btn-default" />
            </div>
        </div>
    </div>
}

Und der Account Controller:

 public ActionResult Login(LoginModel model, string returnUrl)
        {
            if (!this.ModelState.IsValid)
            {
                return this.View(model);
            }

            if (Membership.ValidateUser(model.UserName, model.Password))
            {
                FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                if (this.Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                    && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
                {
                    return this.Redirect(returnUrl);
                }

                return this.RedirectToAction("Korrektur", "Home");
            }

            this.ModelState.AddModelError(string.Empty, "Benutzername oder Passwort falsch");

            return this.View(model);
        }

Es soll also nur die View "Korrektur" geschützt werden.
Wie gesagt, mit dem User geht es, mit der Gruppe nicht.

Ich sehe zwar, dass der User authentifiziert ist, aber autorisiert für die Seite ist er nicht.

Es ist das erste Mal, dass ich mich damit auseinandersetze, was mache ich falsch?

23.03.2018 - 12:40 Uhr

Also mit dem EF Core 2.0.2 geht alles eiwandfrei wie gehabt 🤔

23.03.2018 - 11:56 Uhr

verwendetes Datenbanksystem: MSSQL

Hey,

also langsam macht mich das EF wahnsinnig.
Habe eine ganz normale Code-First Migration erstellt mit einer ganz normalen RowVersion.

Hat auch alles geklappt, die Migration sieht gut aus und in der Datenbank sieht es auch gut aus:

RowVersion(timestamp, not null) 

Im Model:


  [Required, DatabaseGenerated(DatabaseGeneratedOption.Computed)]
        [Timestamp]
        byte[] RowVersion { get; set; }

Habe das auch in anderen Projekten.

Wenn ich hier nun ein Insert mache - also ein neues Objekt anlege und mit Daten fülle (ausser RowVersion) und dann

SaveChanges() bekomme ich eine> Fehlermeldung:
DbEntityValidationException

mit dem Hinweis, dass das Feld RowVersion ein Pflichtfeld ist.

Bisher wurde das vom EF immer automatisch verwaltet und RowVersion automatisch gesetzt.

Bei Update geht es wie gehabt.

Habe ich was vergessen?

21.03.2018 - 16:00 Uhr

Hallo T.

Das mit dem Update per SQL funktioniert, nur bekomme ich bei jedem Update oder Delete folgende Meldung bzw. Exception:> Fehlermeldung:

The data reader is incompatible with the specified '....NlAuftrag'. A member of the type, 'Id', does not have a corresponding column in the data reader with the same name.

Datenbank und Model sehen aber identisch aus. Id ist in jeder Tabelle der PK.
Der Vorgang an sich (Update, Delete) ist aber erfolgreich.
Timestamp wird automatisch aktualisiert.

Eine WebApi stellt kein Problem dar, aber zuerst möchte ich das Grundproblem in den Griff bekommen.

Ich habe auch eine Tabelle, die komplett von verschiedenen Stellen geupdatet wird. Hier sollte der komplette Vorgang dann tatsächlich entsprechend gesperrt werden, was mich eigentlich wieder zum Ausgangsproblem bringt.

Weiter oben hieß es mal, dass man das Lesen und Schreiben sperren kann mit Transaktionen.
Das werde ich mir nochmal anschauen.

21.03.2018 - 10:54 Uhr

Oder spricht noch etwas dagegen in deinem Code?

T-Virus

Nein, das spricht gar nichts dagegen.
Ich dachte nur, das sich so etwas mit dem Entity Framework leicht bewerkstelligen ließe 😃

Habe noch einige Versuche mit dem EF 6 gemacht und

 using (var scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted }))
            

Es wird aber trotzdem das Lesen erlaubt, wenn schon gelesen wird.

Vielen Dank an alle.

20.03.2018 - 18:24 Uhr

Also das mit der Transaktion hilft mir leider doch auch nicht weiter, da das Lesen nicht exclusiv geschieht.
Im Debugger sehe ich, wie beides Mal die 0 ausgelesen wird.

Beim Commit gibt es nachher trotzdem eine DbConcurrency Exception und ich bin wieder gleich weit.

Habe das Lesen, incrementieren und Schreiben in die Transaktion gepackt.

20.03.2018 - 16:52 Uhr

Grundlegend muss du dir Überlegen, wie die Anwendung sich da verhalten soll.

Grundlegend kannst du das Lesen um 1 erhöhen und Speichern in eine Tranaction packen, die so lange den Lesenden zugriff auf den Datensatz blockiert.


>

*bitte beachte unten die angegebenen Einstellungen für EF Core. Es kann sein das es das noch nicht kann. Mein letzter Stand ist das EF Core noch nicht wirklich für den Produktive Betrieb bereit ist.

Das scheint die Lösung zu sein. Im Test ist der neue Wert = 2.

Ich bin überzeugt, dass das in der Praxis sehr selten der Fall sein wird, trotzdem muss ich garantieren, dass das Endergebnis stimmt.

Vielen Dank mal. 👍

20.03.2018 - 16:05 Uhr

Ok, aber wie sieht so ein Service aus?
Gibt es hier Links/Empfehlungen?

20.03.2018 - 14:51 Uhr

verwendetes Datenbanksystem: MSSQL

Ich nutze in meinem Projekt einige Tabellen, die ich mit Code-First erstellt habe und per Migration update.
Jede Tabelle hat eine ID als Primary Key und ein Feld Namens TimeStamp, mit gleichnamigem Attribut.

Auf eine Tabelle greifen mehrere Clients gleichzeitig zu und verändern in einer Zeile ein und denselben Wert.

Heißt also, dass wenn diese gleichzeitig diesen Wert verändern wollen, bekomme ich eine DbUpdateConcurrencyException.

Wenn ich mir optimistisches Sperren so anschaue, dann kann ich den Anwender bei einer ConcurrencyException entscheiden lassen, ob:

  1. Der aktuelle Wert
  2. Der ursprüngliche Wert oder
  3. Der Datenbank Wert

gespeichert werden soll.

Ich muss zugeben, das habe ich nicht ganz verstanden.

Das hilft mir aber auch nicht weiter, da die Speicherung nicht durch einen Anwender erfolgen solll, sondern automatisch im Hintergrund.
Quelle: Handling Concurrency

Ich habe einiges ausprobiert, aber leider ist das Ganze schwer zu Debuggen.

Daher hier ein Gedankenexperiment:

Eine einfache Klasse und die daraus erzeugte Tabelle:


public class TestClass
{
[Required]
public int Id {get;set;}

public int Zaehler {get;set;}

[TimeStamp]
public byte[] TimeStamp {get;set;}
}


Hier soll jetzt der Zaehler jeweils um X erhöht werden.
X soll hier =1 sein.

Zwei Clients greifen also gleichzeitig auf die Tabelle zu und erhöhen den Zaehler jeweils um 1.
Ziel: Es soll danach 2 drinstehen.

Also rufe ich SaveChanges() auf und fange die Exception ab:


try
{
SaveChanges();
}
catch(DbUpdateConcurrencyException ex)
{
...
}

Im catch-Block kann ich nun entscheiden, wie ich hier verfahren soll.
Siehe im Link oben.

Angenommen, der 1. Client erzeugt einen DbContext, liest den Zaehler mit Wert 0 aus und erhöht diesen um 1.

Client 2 macht gleichzeitig dasselbe.

Beide Clients haben also die 0 ausgelesen und sind nun der Meinung, dass er neue Wert von Zaehler = 1 sein soll.

Client 1 ist nun schneller und schreibt die 1 in die Datenbank, Client 2 bekommt nun die DbUpdateConcurrencyException.

Was kann Client 2 nun hier machen?
Nach der Auflistung oben,** so wie ich es verstanden habe:**

Verständnis-Fragen:

  1. Aktueller Wert:
    Ich kann nun den Aktuellen Wert des Client 2 reinschreiben. Also die 1.

  2. Originaler Wert:
    Der Wert aus der Datenbank, bevor **irgendwelche **Änderungen gemacht wurden.
    Also = 0.

  3. Datenbank-Wert:
    Der Wert, der aktuell in der Datenbank steht.
    Also 1, da Client 1 ja schon den Zaehler incrementiert hat

Stimmt das so?

In jedem der drei Fälle bekomme ich keine 2 in den Zaehler.

Ich muss jetzt aber sicherstellen, dass auf jeden Fall die 2 im Zaehler steht.
Welche Möglichkeiten gibt es hier?

Eigentlich müsste ich hingehen, den aktuellen Wert aus der Datenbank auslesen ( also 1) und diesen zu dem aktuellen Wert (also 1 bzw. X) addieren und erneut schreiben.

Was aber, wenn ich dann erneut eine DbUpdateConcurrencyException bekomme?

14.03.2018 - 11:11 Uhr

Jo, so habe ich das hier ja auch vor 😃
Vielen Dank.

14.03.2018 - 10:33 Uhr

Hi Gu,

wie sieht die "full Net API" denn aus?
Hast Du das als WebService implementiert?

14.03.2018 - 10:00 Uhr

Also jetzt geht es.

Meine Klasse leitet von einer Basisklasse ab, welche das Attribut

[DataContract]

Ohne das Attribut geht es.

Was genau das bewirkt, weiß ich jetzt auch nicht mehr, hat aber wohl was mit Serialisierung tun.

Vielen herzlichen Dank an alle, die sich die Mühe gemacht und die Zeit genommen haben mir zu helfen.

14.03.2018 - 09:08 Uhr

Also bin gerade am Testen.
Es scheint an der Klasse SapReadData zu liegen.
Erstelle ich eine lokale Testklasse und packe diese in eine Liste, dann geht alles sauber zurück.
Nur mit meiner Klasse nicht.