Laden...
T
T-Man myCSharp.de - Member
Softwareentwickler Bremen Dabei seit 01.03.2006 210 Beiträge
Benutzerbeschreibung

Forenbeiträge von T-Man Ingesamt 210 Beiträge

24.09.2019 - 16:36 Uhr

Das Produkt haben viele Kunden auf eigenen Servern. Das Kind ist schon in den Brunnen gefallen. 😦
Kann denen nicht sagen, sie sollen Windows- oder Frameworkupdates zurücknehmen. Das Problem ist gestern aufgefallen. Wie lange es schon da ist, also was genau der Auslöser ist, kann ich nicht nachvollziehen. Ich vermute, dass es Framework 4.7.2 ist, muss aber nicht sein. Ich weiß nur, dass jetzt das compress andere Ergebnisse liefert, als vor einiger Zeit. Könnte den Zeitpunkt zwar theoretisch eingrenzen, aber das ist leider auch nicht trivial. Da arbeite ich lieber weiter an der richtigen Lösung.

Hatte halt die Hoffnung, dass es da einen einfachen Schalter gibt.

24.09.2019 - 15:02 Uhr

Das ich migrieren muss ist mir klar.
Werde ich tun.
Ich hatte nur gehofft, einen sehr schnelle fix zu finden, denn die Migration wird ein wenig dauern und bis dahin funktioniert die Duplikatserkennung nicht mehr richtig. Das Produkt ist komplex und wir releasen nicht alle paar Tage. Einen Hotfix könnte ich schnell nachschieben, die Migration nicht.

24.09.2019 - 14:54 Uhr

Sowohl true als auch false liefern das selbe Ergebnis und das ist ein anderes, als vor einiger Zeit.
Kann leider nicht genau sagen, seit wann.

24.09.2019 - 14:50 Uhr

Wie schon gesagt, hilft das nicht.
Der Schalter ist scheinbar für's dekomprimieren, nicht für's komprimieren.

24.09.2019 - 14:43 Uhr

Der Algorithmus, den der DeflateStream verwendet hat sich geändert. Vermutlich mit Framework 4.7.2, genau weiß ich es nicht. Meine Anwendung ist für 4.6.1 gebaut, trotzdem hat sich das Verhalten geändert.
Mein Problem: Ich speichere Daten komprimiert und nicht doppelt. Die Id für einen Stream habe ich aus dem Hash des komprimierten Streams gebildet. Damit kann ich nach Duplikaten suchen. Solange der Algorithmus sich nicht geändert hat, hat das funktioniert.
Jetzt nicht mehr. Wird jetzt ein Dokument komprimiert, dass ich früher schonmal hatte, sieht der komprimierte Stream anders aus und hat einen anderen hash. Ich finde also das Duplikat nicht mehr.

Die saubere Lösung für mich wäre, den Hash des Originals zu verwenden. Nun habe ich aber schon Millionen alte Datensätze, für die ein Update nicht mal eben schnell gemacht ist.

Daher würde ich gerne als Zwischenlösung auf den alten Algorithmus zurückgreifen.

Weiß jemand, ob und wie das geht?

Ich habe folgenden Schalter gefunden, der leider nicht hilft:

<AppContextSwitchOverrides value="Switch.System.IO.Compression.DoNotUseNativeZipLibraryForDecompression=false" />

DoNotUseNativeZipLibraryForCompression gibt's leider nicht.

12.12.2011 - 22:43 Uhr

Danke für den Tip. Ich sollte mich also mit MVC befassen!? Kennst Du da ein gutes Tutorial? Ist das wesentlich anders als asp.net? Kann man das kombinieren?
Und ich hatte gehofft es ginge mit asp.net und ajax.

Gruß
T-Man

12.12.2011 - 22:23 Uhr

Kannst Du Dir mit Java eine Stored Procedure schreiben, die Du für den "Vergleich" verwenden kannst? (Siehe MySQL/JVM)

Gruß
Tony

12.12.2011 - 21:54 Uhr

Ich kann mir einfach nicht vorstellen, dass es kein Ajax-Control gibt, mit dem man genau das machen kann. Das ist doch keine exotische sondern eher eine alltägliche Anforderung, die ich da habe. Da kann es doch nicht wirklich sein, dass ich mir da was selber schustern muss. Da kann ich ja gleich noch eben das Rad neu erfinden...

12.12.2011 - 16:52 Uhr

Vieleicht hilft ja folgender link:

http://wortschatz.uni-leipzig.de/axis/servlet/ServiceOverviewServlet

Es ist scheibar frei und es gibt eine Kreuzworträtsel-Meethode, die Du verwenden könntest.

Gruß
T-Man

12.12.2011 - 16:39 Uhr

Und von welchem Control redet Ihr da?

Vielleicht hätte ich noch erwähnen sollen, das ich mit asp.net arbeite?

Ich habe ein UserControl in dem ich im PageLoad 20 Datensätze Lade und daraus Controls generiere, die ich in das UserControl einbette.
Nun möchte ich wie beschrieben per AJAX weitere nachladen können und weiß leider nicht was für ein Control ich dafür verwenden soll...

Gruß
T-Man

12.12.2011 - 14:38 Uhr

Hallo Diräkt,

ich möchte nicht die linke Seite komplett mit den 20 weiteren Elementen neu übertragen. Ich möchte per Ajax 20 Elemente nachladen und einfügen.

Gruß
T-Man

12.12.2011 - 14:08 Uhr

Moin zusammen!

Ich habe eine wie ich denke einfache Aufgabe und sehe wahrscheinlich den Wald vor lauter Bäumen nicht.

Meine Webanwendung ist mit einem Explorer zu vergleichen. Es gibt zwei Spalten. Links werden Ordner und Dateien angezeigt, rechts Details.
Klicke ich auf eine Datei, wird die rechte seite aktualisiert (die Details zur Datei werden rechts angezeigt).
Beim Klick auf einen Ordner wird die linke Seite aktualisiert. Unterordner und Dateien des gewählten Ordners werden links angezeigt.
Hierfür benutze ich UpdatePanels um nicht immer alles neu zu laden.
Nun zeige ich links allerdings nicht alle Einträge an, sondern nur die ersten 20. Wenn es mehr gibt, kommt darunter ein Link "weitere Elemente nachladen".
Beim Klick auf diesen Link sollen die nächsten 20 Einträge in der linken Liste hinzugefügt werden. Ich habe mir das Ajax Control Toolkit angesehen, finde aber kein Control, das dafür gedacht zu sein scheint. Mit DynamicPopulate ersetzt man Inhalte, aber lädt nicht welche dazu, oder verstehe ich da was falsch? Kann mir jemand sagen, mit welchem Control das geht? Gibt es irgendwo ein gutes Beispiel?
Habe jetzt schon 'ne weile gegoogelt, aber ich scheine wohl nicht die richtigen Begriffe zu verwenden, jedenfalls finde ich nichts gescheites...
Wenn die letzten Elemente nachgeladen wurden, soll optimalerweise der Link verschwinden.
Blättern würde mit einem UpdatePanel gehen, aber das soll es nicht sein. Es sollen bei Bedarf weitere Elemente nachgeladen werden, ohne das die bisherigen verschwinden.

Vielen Dank und Gruß
T-Man

31.08.2011 - 13:03 Uhr

Guter Einwand. Das zeigt nochmal, dass man genau wissen muss, was man eigentlich möchte.
gfoidls Metode liefert übrigens auch nur dann true zurück, wenn man das eps_a entsprechend groß wählt.

31.08.2011 - 12:52 Uhr

Eine wichtige Frage, die man sich stellen muss ist, ob man wirklich eine sehr kleine negative und eine sehr kleine positive Zahl als gleich sehen möchte. Das hängt stark vom Kontext ab.
Wenn man dies nicht möchte, sollte man für absEps bzw. eps_a double.Epsilon setzen wenn man wenigstens -0 und 0 als gleich ansehen möchte.
Soll sogar -0 und 0 als verschieden angesehen werden, setzt man 0 für absEps ein.

31.08.2011 - 12:14 Uhr

gfoidl prüft immer zuerst den absoluten Fehler.

Das ist mMn nicht richtig. Diese Prüfung ist nur bei Zahlen verschieden Vorzeichens sinnvoll. gfoidl hat sie ja genau zu dem Zweck eingebaut, dass zwei Zahlen die näherungsweise 0 sind aber sich im Vorzeichen unterscheiden als gleich angesehen werden können.

Wenn man mit gfoidls Methode zwei Zahlen gleichen Vorzeichens mit einem Absolutbetrag kleiner eps_a vergleicht werden sie immer als gleich angesehen. Auch wenn der relative Unterschied sehr groß ist.

Wenn man das verhindern möchte, muss man die Vorzeichen prüfen. Und wenn man das schonmal tut, muss man nicht mehr Abs verwenden.

Die Methode muss auch nicht unbedingt 'übersichtlich' sein. Wichtiger ist doch, dass sie korrekt und möglichst performant ist.

Gruß
T-Man

31.08.2011 - 11:02 Uhr

Hallo,

Hier mein Vorschlag:

Bei Dir ist, z. B., -10 == 10 - das kann so nicht stimmen...

Autsch. Es muss natürlich

return Math.Abs(value - other) < absEps;

und nicht

return Math.Abs(value + other) < absEps;

sein.

Danke! Werde es korrigieren.

31.08.2011 - 10:57 Uhr

Du könntest z.B. ermitteln welche Konoten entfernt, welche hinzugefügt und welche geändert werden müssen und dann sie entsprechend entfernen, hinzufügen und ändern. Dann bleibt der Baum offen.

Gruß
T-Man

31.08.2011 - 10:33 Uhr

Bei der zweiten Variante (Vergleich der signifikanten Stellen) vermute ich ein Problem:
Wenn wir mit Zahlen mit extremen Exponenten arbeiten, können wir sie nach der Multiplikation noch immer nicht in long wandeln. Müssen wir nicht zunächst den Exponenten wegbekommen und erst danach multiplizieren?

T-Man

31.08.2011 - 10:16 Uhr

Sollte nicht die Prüfung des absoluten Fehlers nur dann erfolgen, wenn es sich um Zahlen verschiedenen Vorzeichens handelt?

Sonst werden besonders kleine Zahlen Grundsätzlich als ähnlich angesehen, selbst wenn sie relativ gesehen sehr unterschiedlich sind.

Hier mein Vorschlag:


        public static readonly double Epsilon = Math.Pow(2d, -52d);

        public static bool IsEqualTo(this double value, double other) { return IsEqualTo(value, other, Epsilon); }

        public static bool IsEqualTo(this double value, double other, double absEps)
        {
            var specialCase = CheckSpecialCases(value, other);
            if (specialCase.HasValue) return specialCase.Value;
            if (value >= .0)
            {
                if (other >= .0)
                    return value > other
                        ? (value - other) / value < Epsilon
                        : (other - value) / other < Epsilon;
            }
            else if (other < .0)
                return value > other
                    ? (other - value) / other < Epsilon
                    : (value - other) / value < Epsilon;
            return Math.Abs(value - other) < absEps;
        }

        private static bool? CheckSpecialCases(double value, double other)
        {
            if (value == other) return true;
            if (double.IsNaN(value)) return double.IsNaN(other);
            if (double.IsNegativeInfinity(value)) return double.IsNegativeInfinity(other);
            if (double.IsPositiveInfinity(value)) return double.IsPositiveInfinity(other);
            if (double.IsNaN(other) || double.IsInfinity(other)) return false;
            return null;
        }

Gruß
T-Man

30.08.2011 - 18:10 Uhr

Wenn Du mit Deiner Methode zwei sehr kleine Zahlen vergleichst sind die dann immer gleich und sehr große Zahlen sind es nie...
Das epsilon muss schon relativ zu den Zahlen sein.
Man muss es also berechnen. Math.Abs muss man auch verwenden...
Von der Performance her dürfte dass nicht gerade besser sein, oder?

30.08.2011 - 17:47 Uhr

Moin zusammen,

ich habe mir eine Extension-Method geschrieben, die vergleichen soll, ob zwei double Werte näherungsweise (bis auf die letzten beiden Stellen) gleich sind.

Nun hätte ich gerne Eure Meinung, ob die so funktioniert, ob es wohl Fälle geben kann, in denen sie nicht funktioniert...

Hier die Methode:


        public static bool ApproximatelyEquals(this double value, double other)
        {
            if (value == other) return true;
            if (value >= .0)
                if (other > value) return value * 1.0000000000001 >= other;
                else if (other >= .0) return other * 1.0000000000001 >= value;
                else return value < 0.0000000000001 && other > -0.0000000000001;
            if (other < .0)
                if (other > value) return other * 1.0000000000001 <= value;
                else return value * 1.0000000000001 <= other;
            return other < 0.0000000000001 && value > -0.0000000000001;
        }

Gruß
T-Man

05.07.2011 - 17:23 Uhr

Moin zusammen.

Ich benutze eine ListView mit LargeIcons. Die Anzuzeigenden Bilder sind nicht quadratisch. Die längere Seite ist allerdings bei allen gleich (126).
Beispiel: (126 x 100, 126 x 110, 89 x 126, ...)
Die Bilder werden leider alle auf 126x126 gestretched. Das möchte ich verhindern. Kann mir da einer helfen?
Die LargeImageList bekommt eine ImageSize von 126x126. Daran liegt es dann wohl auch. Aber was kann ich da tun? Muss ich mir die Bilder in ein durchsichtiges Bild der Größe 126x126 zentriert reinzeichnen, und dieses dann verwenden, oder gibt es eine einfachere Lösung?

T-Man

09.06.2011 - 10:35 Uhr

Ich habe jetzt das Problem. Die fremde exe erzeugt neben sich eine Datei.
Wenn ich das mit einer eigenen nachbilde, bekomme ich den selben Fehler.
Scheinbar wird der Service vom IIS neu gestartet sobald in einem Unterverzeichnis neue Dateien entstehen. Kann man das dem IIS abgewöhnen?

09.06.2011 - 09:54 Uhr

Habe es mit

        static void Main(string[] args)
        {
            File.WriteAllText(args[1], File.ReadAllText(args[0]));
        }

nachgebaut und bekomme den Fehler nicht.

Die Anzahl der Prozesse ist vor und nach dem Aufruf der original exe übrigens gleich. Die Aufgerufene exe erzeugt also wohl keine neuen Prozesse, die hinterher noch laufen und zu Problemen führen könnten...

Der Unterschied zwischen meiner und der original exe ist u.a., dass meines ein .net Programm ist, während die andere in c++ programmiert wurde.

Noch Ideen?

08.06.2011 - 19:32 Uhr

Leider ist die exe 'ne externe. Ich kenne den Aufbau nicht. Sie extrahiert den Volltext aus einer Datei und schreibt ihn in eine andere Datei. Ob sie dafür Hintergrundprozesse startet etc. weiß ich nicht, das müsste ich den Hersteller fragen...

Ich denke, ich muss das ganze asynchron laufen lassen.

Die Exception fange ich übrigens noch im Service wieder ab, daher keine FaultException.

Danke für Deine Antworten

08.06.2011 - 19:16 Uhr

Ich habe nun in die exe, die nichts tut ein Thread.Sleep(2000) eingebaut. Das dauert eindeutig länger als das Ausführen der anderen exe und ich bekomme den Fehler nicht. Es liegt also nicht an der Dauer. Es muss mit der exe zu tun haben. Die muss noch irgendwelche Nachwirkungen haben, aber wie kann das sein?

08.06.2011 - 18:49 Uhr

Ich habe übrigens mittlerweile die Lösung gefunden.

Ich hatte die Leserechte auf den privaten Schlüssel des Zertifikates für IIS_IUSRS gesetzt. Das war auf dem Win7 Rechner so ok. Auf dem 2008 Server musste ich die Rechte für den "NetworkService" setzen. Logisch, da ja der AppPool mit dieser Identität läuft...

08.06.2011 - 18:27 Uhr

Danke, Ich denke, Du hattest den richtigen Riecher. Wenn ich eine exe aufrufe, die gar nichts tut, klappt es.

Aber was ist ein internes Timeout (im Gegensatz zum Timeout das sofort eine Exception im Client erzeugt)? An welcher Schraube muss ich da drehen?
Der Prozess braucht übrigens ca 1 sec und ich sehe in den app.- und web.config Dateien keine Timeouts, die kleiner als 10sec sind.

Und wie kann es einen Timeout geben, wenn doch die Methode erfogreich beendet wird?

08.06.2011 - 17:47 Uhr

Moin zusammen,

ich habe einen WCF service mit wsHttpBinding und Message Security.

Bislang funktionierte alles wunderbar.

Nun rufe ich in einer Methode des Service eine exe auf:

                using (var proc = new Process())
                {
                    proc.EnableRaisingEvents = false;
                    proc.StartInfo.FileName = Path.Combine(exePath, "ex.exe");
                    proc.StartInfo.Arguments = string.Format("\"{0}\" \"{1}\"", sourceFile, destFile);
                    proc.StartInfo.RedirectStandardError = true;
                    proc.StartInfo.UseShellExecute = false;
                    proc.Start();
                    if (!proc.WaitForExit(10000 + (int)Math.Min(filesize / 50L, 600000L)))
                    {
                        proc.Kill();
                        Thread.Sleep(1000);
                        throw new Exception("Timeout");
                    }
                    using (var errorReader = proc.StandardError)
                    {
                        var error = errorReader.ReadToEnd();
                        if (!string.IsNullOrEmpty(error)) throw new Exception(error);
                    }
                }

Das funktioniert auch wunderbar. Ich werte das Ergebnis aus liefere es zurück...
Bei dem nächsten Aufruf einer (anderen) Methode des Services bekomme ich allerdings eine FaultException mit der folgenden Fehlermeldung:

Fehlermeldung:
Die Nachricht konnte nicht verarbeitet werden. Wahrscheinliche Ursache: Die Aktion "..." ist falsch ist, die Nachricht enthält ein ungültiges oder abgelaufenes Sicherheitskontexttoken oder zwischen Bindungen besteht ein Konflikt. Das Sicherheitskontexttoken wäre ungültig, wenn der Dienst den Kanal aufgrund von Inaktivität abgebrochen hätte. Erhöhen Sie das Empfangszeitlimit für die Bindung des Dienstendpunkts, um zu verhindern, dass der Dienst Leerlaufsitzungen vorzeitig abbricht.

Unter InnerException.Code.SubCode.Name steht BadContextToken.

Wenn ich den obigen Code auskommentiere läuft alles wie es soll.

Hat jemand eine Idee, wieso der (erfolgreiche) Aufruf eines externen Prozesses in einer Service Methode dafür sorgt, dass der Kanal "gefaulted" wird?

Gruß
T-Man

23.05.2011 - 13:30 Uhr

Weitere Infos:

Auf dem Win7 Rechner ist die Identität des Anwendungspools "ApplicationPoolIdentity".

Auf dem 2008 Server ist es "NetworkService". Wenn ich es dort mit "ApplicationPoolIdentity" versuche kann ich den Service gar nicht erst starten.

Gruß T-Man

20.05.2011 - 12:08 Uhr

Moin zusammen,

ich habe einen WCF Service mit zwei Schnittstellen.
Eine ungesicherte Basisschnittstelle mit einfachem basicHttpBinding
Und eine gesicherte Schnittstelle mit wsHttpBinding

Hier die web.config des Servers:


<?xml version="1.0" encoding="utf-8"?>
<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicBinding" />
      </basicHttpBinding>
      <wsHttpBinding>
        <binding name="wsHttpBinding">
          <security>
            <message clientCredentialType="UserName" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="amagnoBehavior" name="Amagno.AmagnoService.AmagnoService">
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="wsHttpBinding"
          name="wsHttp" contract="Amagno.ExternalServiceContracts.IAmagnoService" />
        <endpoint address="/Basic" binding="basicHttpBinding" bindingConfiguration="BasicBinding"
          name="Basic" contract="Amagno.ExternalServiceContracts.IAmagnoBasicService" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="amagnoBehavior">
          <serviceCredentials>
            <serviceCertificate storeName="My" storeLocation="LocalMachine" findValue="CN=test.amagno.org" />
            <userNameAuthentication userNamePasswordValidationMode="Custom"
              customUserNamePasswordValidatorType="Amagno.Base.AmagnoUserNamePasswordValidator, AmagnoBase" />
          </serviceCredentials>
          <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
  <appSettings>
...
  </appSettings>

</configuration>

Und nun die app.config des Clients:


<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <behaviors>
            <endpointBehaviors>
                <behavior name="wsHttpBehavior">
                    <clientCredentials>
                        <serviceCertificate>
                            <authentication certificateValidationMode="None" revocationMode="NoCheck" />
                        </serviceCertificate>
                    </clientCredentials>
                </behavior>
            </endpointBehaviors>
        </behaviors>
        <bindings>
            <basicHttpBinding>
                <binding name="Basic" closeTimeout="00:01:00" openTimeout="00:01:00"
                    receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false"
                    bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="268435456" maxBufferPoolSize="524288" maxReceivedMessageSize="268435456"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="268435456"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
            <wsHttpBinding>
                <binding name="wsHttp" closeTimeout="00:01:00" openTimeout="00:01:00"
                    receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false"
                    transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferPoolSize="524288" maxReceivedMessageSize="268435456"
                    messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                    allowCookies="false">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <reliableSession ordered="true" inactivityTimeout="00:10:00"
                        enabled="false" />
                    <security mode="Message">
                        <transport clientCredentialType="Windows" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" negotiateServiceCredential="true" />
                    </security>
                </binding>
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost/AmagnoService/AmagnoService.svc"
                behaviorConfiguration="wsHttpBehavior" binding="wsHttpBinding"
                bindingConfiguration="wsHttp" contract="AmagnoServiceReference.IAmagnoService"
                name="wsHttp">
                <identity>
                    <dns value="test.amagno.org" />
                    <certificate encodedValue="Aw....." />
                </identity>
            </endpoint>
            <endpoint address="http://localhost/AmagnoService/AmagnoService.svc/Basic"
                binding="basicHttpBinding" bindingConfiguration="Basic" contract="AmagnoServiceReference.IAmagnoBasicService"
                name="Basic">
              <identity>
                <dns value="test.amagno.org" />
              </identity>
            </endpoint>
        </client>
    </system.serviceModel>
</configuration>

Da ich bloß ein selbst erstelltes Test Zertifikat verwende, muss vorläufig

<authentication certificateValidationMode="None" revocationMode="NoCheck" />

in der app.config stehen. Das wird sich natürlich später ändern.

Wenn ich den Server auf meinem Windows-7 Rechner laufen lasse, klappt alles wunderbar. Beide Services sind erreichbar. Egal ob ich den Client auf dem selben Rechner oder auf einem anderen laufen lasse.

Wenn ich den Server allerdings auf unserem 1&1 Server (Windows 2008 R2 Server) laufen lasse, klappt nur die Verbindung zum basis Service. Auch wenn der Client ebenfalls auf diesem Server läuft.
Scheinbar wird die Anfrage bereits vom IIS geblockt, denn die Authentifizierungs-Methode des AmagnoUserNamePasswordValidator wird gar nicht erst aufgerufen.

Folgende SecurityNegotiationException bekomme ich, wenn ich eine Methode des gesicherten Service aufrufe:> Fehlermeldung:

Der Aufrufer wurde vom Dienst nicht authentifiziert.
InnerException (FaultException): Die Anforderung für ein Sicherheitstoken konnte nicht erfüllt werden, weil ein Fehler bei der Authentifizierung auftrat.
InnerException StackTrace: bei System.ServiceModel.Security.SecurityUtils.ThrowIfNegotiationFault(Message message, EndpointAddress target)
bei System.ServiceModel.Security.SspiNegotiationTokenProvider.GetNextOutgoingMessageBody(Message incomingMessage, SspiNegotiationTokenProviderState sspiState)

StackTrace:

Server stack trace:
bei System.ServiceModel.Security.IssuanceTokenProviderBase1.DoNegotiation(TimeSpan timeout) bei System.ServiceModel.Security.SspiNegotiationTokenProvider.OnOpen(TimeSpan timeout) bei System.ServiceModel.Security.TlsnegoTokenProvider.OnOpen(TimeSpan timeout) bei System.ServiceModel.Security.WrapperSecurityCommunicationObject.OnOpen(TimeSpan timeout) bei System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) bei System.ServiceModel.Security.CommunicationObjectSecurityTokenProvider.Open(TimeSpan timeout) bei System.ServiceModel.Security.SymmetricSecurityProtocol.OnOpen(TimeSpan timeout) bei System.ServiceModel.Security.WrapperSecurityCommunicationObject.OnOpen(TimeSpan timeout) bei System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) bei System.ServiceModel.Channels.SecurityChannelFactory1.ClientSecurityChannel1.OnOpen(TimeSpan timeout) bei System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) bei System.ServiceModel.Security.SecuritySessionSecurityTokenProvider.DoOperation(SecuritySessionOperation operation, EndpointAddress target, Uri via, SecurityToken currentToken, TimeSpan timeout) bei System.ServiceModel.Security.SecuritySessionSecurityTokenProvider.GetTokenCore(TimeSpan timeout) bei System.IdentityModel.Selectors.SecurityTokenProvider.GetToken(TimeSpan timeout) bei System.ServiceModel.Security.SecuritySessionClientSettings1.ClientSecuritySessionChannel.OnOpen(TimeSpan timeout)
bei System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
bei System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan timeout)
bei System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
bei System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(ServiceChannel channel, TimeSpan timeout)
bei System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(TimeSpan timeout, CallOnceManager cascade)
bei System.ServiceModel.Channels.ServiceChannel.EnsureOpened(TimeSpan timeout)
bei System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
bei System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
bei System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]:
bei System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
bei System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
bei Amagno.WindowsClient.AmagnoServiceReference.IAmagnoService.GetAuthenticatedUser(GetAuthenticatedUserArg arg)
bei Amagno.WindowsClient.AmagnoServiceReference.AmagnoServiceClient.GetAuthenticatedUser(GetAuthenticatedUserArg arg) in d:\Amagno\Client\AmagnoWindowsClient\Service References\AmagnoServiceReference\Reference.cs:Zeile 6849.

Ich habe auf dem Server VisualStudio installiert um debuggen zu können und die Verbindung zum basic Service klappt auch wunderbar...

Leider habe ich keine Ahnung, wo ich ansetzen soll. Ich bin kein Admin und habe auch keinen zu Verfügung.
Wo loggt der IIS die Verbindungsversuche und die Fehler? Wo kann ich da reinschauen? Was muss ich im IIS einstellen, damit die Anfrage durchkommt?

Kann mir jemand weiterhelfen?

Gruß
T-Man

26.01.2011 - 16:31 Uhr

Das mit dem event klappt aber nicht, wenn er im destruktor den aktuellen Wert lesen möchte.

26.01.2011 - 15:53 Uhr

Du könntest statt der Referenz auf die bool Variable zwei Lambda Expressions übergeben, eine die die Variable setzt, eine zweite, die den Wert liefert, sofern Du beides brauchst...

Gruß
T-Man

26.01.2011 - 15:37 Uhr

Moin zusammen,

ich möchte einen WCF Service erstellen mit zwei Endpunkten.
Bindings: netTcp und wsHttp
Security Mode: jeweils Message
Client Credential Type: jeweils UserName

Die Beispiele aus dem Wrox-Buch "Professionasl WCF 4" setzen für die Identität der Endpunkte X509-Zertifikate ein. Darauf möchte ich gerne verzichten. Wenn ich das richtig verstanden habe, kann man aber auf die Identität nicht verzichten, da diese für die Server Zertifizierung nötig ist. Nun gibt es die Möglichkeit für die Identität einen RSA Schlüssel, statt eines X509 Zertifikats zu verwenden. Nun mein Problem: Ich finde nirgends 'ne Anleitung, wie das geht. Kann mir da jemand weiterhelfen?

Danke
T-Man

25.01.2011 - 15:07 Uhr

Moin zusammen,

hier die Systemdetails:

OS: Windows 7 Home Premium (x64)
Visual Studio 2010 Professional
IIS7.5 (Features siehe angehängtes Bild)

Der IIS wurde erst nach dem Visual Studio installiert.

Ich habe ein Framework 4.0 Projekt "wcf dienstanwendung" angelegt.
Kompiliert.
Dann mit dem wcf konfigurations editor die web.config bearbeitet.

  • Neuen Dienst erstellt
  • die dll ausgewählt ...
  • HTTP
  • Basic
  • keine Adresse
  • Endpunkt in "Basic" benannt
  • Ein Binding erstellt und auch Basic benannt
    Gespeichert
    In den Projekteigenschaften unter WEB "Lokalen IIS-WebServer verwenden" angewählt.
    Mit F5 gestartet

Nun bekomme ich statt einer Seite auf der u.a. "Metadata publishing for this service is currently disabled" stehen sollte eine Fehlerseite mit dem Fehler 403.14.

Ich habe aspnet_regiis -i für Framework64\v4.... und Framework\v4....
ausgeführt. Außerdem "ServiceModelReg -ia" für beide 4er Frameworks und "ServiceModelReg -i" in ....\v3.0\Windows Communication Foundation"

Das hat alles nichts geholfen.

Weiß jemand Rat?

Vielen Dank im voraus
T-Man

22.09.2010 - 13:50 Uhr

Ich weiß jetzt wie es theoretisch geht.
Da ich nur herausfinden sollte, ob es geht kann ich hier nicht die konkrete Lösung präsentieren.

Gruß
T-Man

22.09.2010 - 12:50 Uhr

OT:
@T-Man: wo hast Du das NotNullAttribute her? Habe ich was verpaßt oder ist das eine Eigenkreation? Von ReSharper. Das hätte ich hier weglassen können...

22.09.2010 - 12:15 Uhr

Danke für den Tipp, er führt mich schon etwas weiter. Leider noch nicht zum Ziel.

ExpressionTrees verstehe ich jetzt ungefähr. Für einfachere Abfragen könnte ich auch einen aufstellen.

Hier müsste ich ja sowas wie

Where(sv => sv._BracketValues[0].DestinationItemId == _BracketValues[0].DestinationItemId && 
sv._BracketValues[1].DestinationItemId == _BracketValues[1].DestinationItemId && ...)

dynamisch erstellen.

Aber wie referenziere ich die einzelnen Elemente von _BracketValues um sie zu vergleichen? Der Indexer und ElementAt sind nicht in SQL übersetzbar, sprich, mein Beispiel funktioniert nicht.

Kann mir da jemand einen weiteren Tipp geben?

Danke!
T-Man

21.09.2010 - 17:26 Uhr

verwendetes Datenbanksystem: MSSQL

Moin!

Hier zunächst die wichtigsten Klassen aufs wesentliche reduziert:


    public abstract class DataValue
    {
        [Column(IsPrimaryKey = true)]
        public Guid Id { get; internal set; }

        [Column(IsDiscriminator = true)]
        private string Class;

        [Column]
        public Guid? MetadataId { get; internal set; }
        private EntityRef<Bracket> _Metadata;
        [DataMember]
        [Association(ThisKey = "MetadataId", OtherKey = "Id")]
        internal Bracket Metadata { get { return _Metadata.Entity; } set { _Metadata.Entity = value; } }

        internal virtual IQueryable FindEqualInList([NotNull]IQueryable list)
        {
            return list.Cast<DataValue>().Where(dv => dv.MetadataId == MetadataId || dv.MetadataId == null && MetadataId == null);
        }
    }

    public class BoolValue : SimpleValue
    {
        [Column(CanBeNull = true)]
        private bool? boolValue;

        internal override IQueryable FindEqualInList(IQueryable list)
        {
            return base.FindEqualInList(list.OfType<BoolValue>().Where(bv => bv.boolValue == null && boolValue == null || bv.boolValue == boolValue));
        }
    }

    public class Bracket : DataValue
    {
        [Association(OtherKey = "SourceItemId")]
        internal EntitySet<ValueAssign> _BracketValues = new EntitySet<ValueAssign>();

        internal override IQueryable FindEqualInList(IQueryable list)
        {
            return base.FindEqualInList(list.OfType<Bracket>()).Cast<Bracket>().Where(sv => sv._BracketValues.Count() == _BracketValues.Count).ToList().FindAll(sv =>
                sv._BracketValues.All(va1 => _BracketValues.FirstOrDefault(va2 =>
                    va2.Ordinal == va1.Ordinal && va2.DestinationItemId == va1.DestinationItemId) != null)).AsQueryable();
        }
    }

    public class ValueAssign
    {
        [Column(IsPrimaryKey = true)]
        internal Guid SourceItemId { get; set; }

        [Column]
        public Guid DestinationItemId { get; internal set; }

        [Column(IsPrimaryKey = true)]
        public int Ordinal { get; internal set; }

        private EntityRef<DataValue> _DestinationItem;
        [Association(ThisKey = "DestinationItemId", OtherKey = "Id")]
        public DataValue DestinationItem
        {
            get { return _DestinationItem.Entity; }
            set { _DestinationItem.Entity = value; }
        }
    }

Wenn ein neuer DataValue gespeichert werden soll, rufe ich für diesen zunächst FindEqualInList() mit der Tabelle als Parameter auf um zu sehen, ob es schon einen identischen Wert gibt... Das funktioniert auch wunderbar. Leider verlasse ich in dem FindEqualInList in der Klasse Bracket den DataBase-Context in dem Moment in dem ich das ToList() aufrufe. Hier werden alle in Frage kommenden Brackets aus der DB geladen und dann wird die Liste weiter eingeschränkt. Ich mache das ToList().FindAll(), da ein Where nicht funktioniert, da die weitere Lambda-Expression nicht in SQL übersetzt werden kann.

Nun meine Frage: (Wie) kann ich die Lambda-Expression so umwandeln, dass sie in SQL übersetzbar ist? Das würde das Laden in den Speicher verhindern und sicher wesentlich schneller laufen.

Vielen Dank schon mal in voraus.
T-Man

12.05.2010 - 09:31 Uhr

Über die EventArgs kannst Du die Klick-Position bekommen. Ich vermute, damit müsstest Du es berechnen können...

Gruß
T-Man

30.04.2010 - 12:43 Uhr

Moin!

ich habe folgende Klassen:


    [DataContract]
    [Table(Name = "DataValues")]
    [InheritanceMapping(Code = "BoolValue", Type = typeof(BoolValue))]
    [InheritanceMapping(Code = "Bracket", Type = typeof(Bracket), IsDefault = true)]
    public abstract class DataValue
    {
        [Column(IsPrimaryKey = true)]
        public Guid Id { get; set; }

        [Column(IsDiscriminator = true)]
        private string Class;

        public Enum Association { get { return _Association.ToEnum(); } set { _Association = value.ToFullName(); } }
        [Column]
        [DataMember]
        private string _Association { get; set; }

        [Column]
        public Guid? MetadataId { get; set; }
        private EntityRef<Bracket> _Metadata;
        [DataMember]
        [Association(ThisKey = "MetadataId", OtherKey = "Id")]
        public Bracket Metadata { get { return _Metadata.Entity; } set { _Metadata.Entity = value; } }
    }


    [DataContract]
    public class BoolValue : DataValue
    {
        [DataMember]
        [Column(CanBeNull = true)]
        public bool Bool { get; set; }
    }


    [DataContract]
    public class Bracket : DataValue, IEnumerable<ValueAssign>
    {
        [Association(OtherKey = "SourceItemId")]
        internal EntitySet<ValueAssign> _BracketValues = new EntitySet<ValueAssign>();

        [DataMember]
        private List<ValueAssign> BracketValues { get; set; }

        public IEnumerator<ValueAssign> GetEnumerator()
        {
            return BracketValues.GetEnumerator();
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return BracketValues.GetEnumerator();
        }
    }


    [DataContract]
    [Table(Name = "ValueAssigns")]
    public class ValueAssign
    {
        [Column(IsPrimaryKey = true)]
        internal Guid SourceItemId { get; set; }

        [Column(IsPrimaryKey = true)]
        public Guid DestinationItemId { get; internal set; }

        [DataMember]
        [Column(IsPrimaryKey = true)]
        public int Ordinal { get; internal set; }

        private EntityRef<DataValue> _DestinationItem;
        [DataMember]
        [Association(ThisKey = "DestinationItemId", OtherKey = "Id")]
        public DataValue DestinationItem { get { return _DestinationItem.Entity; } set { _DestinationItem.Entity = value; } }

        public Enum Association { get { return _Association.ToEnum(); } internal set { _Association = value.ToFullName(); } }
        [DataMember]
        [Column]
        private string _Association { get; set; }
    }

Nun zum Problem: Vorher war die Liste BracketValues in der Klasse Bracket public und es wurde überall direkt darauf zugegriffen. Bracket war nicht IEnumerable.

Jetzt wollte ich gerne im Add und anderen Methoden noch was prüfen und den Zugriff auf BracketValues nur noch indirekt zulassen. Dazu habe ich Methoden wie Add und Remove in Bracket angelegt und Bracket auch die Schnittstelle IEnumerable gegeben, da ich häufig in foreach-Schleifen über die BracketValues ging...

Nun bekomme ich aber ein Problem mit der Erzeugung der Tabellen in der Datenbank. Wenn ich mein Programm startete, wurden alle Tabellen in der DB erzeugt, wenn sie noch nicht da waren. Jetzt bekomme ich dort folgende Fehlermeldung: Das Schlüsselelement "Id" für Schlüssel "Id" im Typ "ValueAssign" konnte nicht gefunden werden. Entweder ist der Schlüssel falsch, oder der Name des Felds bzw. der Eigenschaft in "ValueAssign" wurde geändert.

Mir ist klar, das es an dem IEnumerable liegt, aber ich weiß nicht, was das Problem genau ist und wie ich es lösen kann. Ich habe mal das IEnumerable rausgenommen und dafür eine ToArray() Methode eingeführt, über die ich die foreach Schleifen nun laufen lasse. Damit funktioniert es wieder. Dennoch würde ich lieber das IEnumerable drin lassen. In meinem Linq-Buch steht dazu natürlich nichts. Auch die Beschreibung des Table-Attributes liefert nichts. Kann mir einer von Euch das Problem erklären, oder auf gute Lektüre verweisen, in der es geklärt wird?

Ich habe die Klassen hier natürlich auf das nötigste reduziert...

Vielen Dank in voraus!
T-Man

Hat echt keiner 'ne Ahnung? 😦

23.02.2010 - 17:50 Uhr

Kann es sein, das evtl. auch einige Spaltennamen reservierte Wörter sind? Auch die Spaltennamen solltest Du mit [] klammern...

Gruß
T-Man

23.02.2010 - 17:45 Uhr

Moin zusammen!

Ich bastele gerade mit Advanced Installer einen neuen Installer für mein Produkt. Vorher hatte ich einen selbst gebauten, der nicht Windows Installer benutzte. Nun habe ich eine Aufwendigere Custom Action in C# geschrieben, da ich weder c++ noch vbscript beherrsche. Die dll ist ComVisible und wird mit regasm registriert. Mit einem einfachen VBScript rufe ich nun die c#-Methode auf.

Script: Session.Property("OLDAPPLICATIONPATH") = CreateObject("InstallationTool.InstallationTool").GetOldApplicationPath()

Auf 32 Bit Systemen funktioniert es wunderbar.

Nun versuche ich das selbe auf einem 64 Bit System.
Im Advanced Installer gibt es bei der Custom Action eine CheckBox "64 Bit Script"
Wenn ich dieses setzte bekomme ich einen Fehler. InstallationTool.InstallationTool kann nicht erstellt werden.
Wenn ich das Häkchen nicht setze, gibt es keinen Fehler, aber die Funktion liefert nicht das zurück was sie sollte. Sie liefert null statt des Pfades, der in der Registry steht...

Ich habe dann eben schnell zum Test in c# eine Consolen Anwendung geschrieben, die die Methode (GetOldApplicationPath()) aufruft und das Ergebnis auf der Console ausgibt. Wenn ich dieses ausführe, bekomme ich das erwünschte Ergebnis.

Wieso klappt es mit VBScript nicht? Was läuft falsch, bzw. was muss ich anders machen?

Hier eben noch der Code der GetOldApplicationPath:

        public string GetOldApplicationPath()
        {
            string path = null;
            using (RegistryKey softwareKey = Registry.LocalMachine.OpenSubKey("Software"))
                if (softwareKey != null)
                    using (RegistryKey dpKey = softwareKey.OpenSubKey("DocuPortal.NET"))
                        if (dpKey != null)
                            using (RegistryKey verKey = dpKey.OpenSubKey("Version"))
                                if (verKey != null)
                                {
                                    using (RegistryKey volKey = verKey.OpenSubKey("VOL8"))
                                        if (volKey != null)
                                            foreach (string v8Instance in volKey.GetSubKeyNames())
                                                using (RegistryKey instKey = volKey.OpenSubKey(v8Instance))
                                                    if (instKey != null)
                                                    {
                                                        var val = instKey.GetValue("ApplicationPath");
                                                        if (val != null)
                                                            path = val.ToString();
                                                        if (Directory.Exists(path))
                                                        {
                                                            instKey.Close();
                                                            break;
                                                        }
                                                        path = null;
                                                    }
                                    if (path == null)
                                        using (RegistryKey volKey = verKey.OpenSubKey("VOL7"))
                                            if (volKey != null)
                                                foreach (string v7Instance in volKey.GetSubKeyNames())
                                                    using (RegistryKey instKey = volKey.OpenSubKey(v7Instance))
                                                        if (instKey != null)
                                                        {
                                                            var val = instKey.GetValue("ApplicationPath");
                                                            if (val == null) continue;
                                                            path = val.ToString();
                                                            if (Directory.Exists(path))
                                                            {
                                                                string dllPath = Path.Combine(Path.Combine(path, "bin"), "data.dll");
                                                                if (File.Exists(dllPath))
                                                                {
                                                                    var fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(dllPath);
                                                                    if (fvi.ProductBuildPart >= 1235) break;
                                                                }
                                                            }
                                                            path = null;
                                                        }
                                }
            if (path != null) path = Path.GetDirectoryName(path);
            return path;
        }

Vielen Dank schon Mal im voraus für eventuelle Hilfe.
Gruß T-Man

20.11.2009 - 14:21 Uhr

(<!\w)@\w+\b

19.11.2009 - 16:54 Uhr

Hier ein Beispiel:


string oldName = "000_111_test_2.jpg";
string newName = Regex.Match(oldName, @"(?<=\d+_\d+_).+").Value; // liefert test_2.jpg

Gruß
T-Man

19.11.2009 - 13:11 Uhr

Oh, sehe gerade, dass es Absteigend sein soll.
Dann

p2.Relevance - p1.Relevance

T-Man

19.11.2009 - 13:10 Uhr

Ich bin mir nicht sicher, aber wäre nicht folgende Lösung das richtige:

System.Array.Sort(array, (p1, p2) => p1.Relevance - p2.Relevance);

Ich gehe dabei davon aus das dein Product ein Feld oder Property vom Typ int mit Namen "Relevance" hat.

Gruß
Tony

19.11.2009 - 12:52 Uhr

Wie ist denn die Regel des Namens?

zahl, unterstrich, zahl, unterstrich, name ?

oder

zahl, unterstrich, zahl, unterstrich, "test", eventuelle zahl, ".jpg"

Je nachdem muss die Regex unterschiedlich aussehen.

Ich würde Dir das Regex-Tutorial empfehlen http://www.regular-expressions.info/tutorial.html

Wenn klar ist, dass es nur die beiden Unterstriche gibt, kannst Du auch mit FindLast("_") die Position des letzten Unterstrichs ermitteln und mit SubString arbeiten...

Wichtig ist, dass Du weißt, wie die Namen allgemein aussehen können...

Gruß
T-Man