Laden...
S
Benutzerbeschreibung

Forenbeiträge von SkySurfer Ingesamt 298 Beiträge

08.08.2011 - 12:09 Uhr

Hallo,

ich bin gerade dabei ein Projekt von MS Sync Framework 1 auf das aktuelle 2.1 umzustellen. Dabei möchte ich auch das ganze Synctabellen, Trigger und Stored Procedure Zeug los werden und das Change Tracking das SQL Servers 2008 nutzen. Von dem ich mir mehr Übersicht in der Datenbank (weil nicht zu jeder Tabelle noch extra Tabellen angelegt werden müssen) und mehr Performance (weil nicht mehr über Trigger und Stored Procedures behandelt) erhoffe.

In der Version 2.0 des Sync Frameworks musste man hierfür eine DbServerSyncProvider nehmen und die SQL Statements auf das Change Tracking des SQL Servers anpassen. Das Filtern erfolgte dann in abgeleiteten SyncAdaptern in denen man ebenfalls die SQL Statements anpassen musste.

Beim lesen der Hilfe für die Version 2.1 habe ich gesehen, dass in Verbindung mit dem SqlSyncProvider die Möglichkeit gibt Zeilen und Spaltenfilter schöner zu definieren als durch das anpassen des SyncAdapters. Was ich aber aus der Hilfe nicht eindeutig rauslesen konnte, war ob der SqlSyncProvider nun das ChangeTracking des SQL Servers unterstützt. Dies war in der Version 2.0 noch nicht der Fall.

Hat hier vielleicht schon jemand Erfahung mit der Version 2.1?

Gruß SkySurfer

13.07.2011 - 11:18 Uhr

Hi,
ich habe ein UserControl erstellt auf dem ein GridView und eine ObjectDataSource
liegen. Diese bekommen über eine Eigenschaften die Information welche Daten angezeigt werden sollen. Das UserControl bietet eine Update Methode welche das Query ausführt und anschließen ein Changed Event des UserControls auslößt.


   public void Update()
   {
      ObjectDataSource1.SelectParameters["Param1"].DefaultValue = _param1.ToString();
      ObjectDataSource1.SelectParameters["Param2"].DefaultValue = _param2.ToString();
      GridView1.DataBind();
      GridView1.SelectedIndex = 0;
      SelectedIndexChanged(this, EventArgs.Empty);
   }

Die Daten werden in das GridView geladen und der erste Datensatz wird selektiert. Die DataKeyNames Eigenschaft des GridViews ist auf den Primärschlüssel des Datensatzes gesetzt und wird über eine Eigenschaft direkt wieder an die Seite zurück geben.


   public int SelectedData
   {
      get
      {
         int data = 0;
         if (GridView1.SelectedPersistedDataKey != null)
         {
            data = (int) GridView1.SelectedPersistedDataKey.Value;
         }
         return data;
      }
   }

Die Parameter für dieses UserControl werden über eine andere GridView ausgewählt und an das UserControl in der SelectedIndexChanged Methode übertragen.

Das ganze funktioniert beim ersten Pageload (IsPostBack = false)
und wenn ich die Daten im GridView des UserControls per Maus selektiere. Dann wird das SelectedChangedEvent des UserControls gefeuert und die Seite bekommt über die SelectedData Eigenschaft den richtigen Wert geliefert.

Wenn ich jedoch einen anderen Parameter für das UserControl in dem GridView der Seite wähle wird zwar das GridView im UserControl aktualisiert und zeigt die richtige Datan an aber die SelectedData Eigenschaft liefert noch den zuletzt selektierten Wert zurück und noch nicht den neuen, welcher jedoch bereits im UserControl als selektiert dargestellt wird.

Woran kann das liegen?

Gruß SkySurfer

22.06.2011 - 15:03 Uhr

Nur Methoden die von deinem WebService bereit gestellt werden sollen
benötigen das WebMethod Attribut

Erster Treffer bei Google

22.06.2011 - 14:58 Uhr

Wirf die Dateien in das gleiche Verzeichnis wie deine DLL hier sollte auch gesucht werden wenn Sie im GAC nicht gefunden werden.

22.06.2011 - 14:46 Uhr

Hast du alle zugehörigen Dateien des MySQL Connectors auf den Server deployed ?

22.06.2011 - 14:30 Uhr

Fehlt vielleicht der Verweis auf die MySQL Connector DLL?

22.06.2011 - 14:07 Uhr

Also den Connector bekommst du hier : MySQL ADO.NET Connector

Ein ganz brauchbares Beispiel gibt es hier : MySQL .NET With C#

22.06.2011 - 13:49 Uhr

Hi,

kann denn eine Verbindung mit dem Server hergestellt werden?
Mal ein Ping versucht bzw. eine Verbindung mit einem anderen Client
(HeidiSql, Database Brower, etc) versucht?

Und wo ich mir das grad nochmal durchlese:
Bist du dir sicher, dass man mit der SqlConnection sich mit einem MySQL Server
verbinden kann?

Ich habe dafür immer den ADO.NET Adapter von MySQL verwendet. Damit gab es nie Probleme.

Gruß SkySurfer

22.06.2011 - 11:13 Uhr

Ja im Browser sind sie erlaubt. Ich hab es auch schon mit Autodetect versucht und er nutzt Cookies.

Ich hab auch mal etwas rum gespielt und die Cookies in der Authenticate Methode selbst gesetzt:


   protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
   {
      bool auth = Membership.ValidateUser(Login1.UserName, Login1.Password);
      if(auth)
      {
         e.Authenticated = true;
         FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,Login1.UserName, DateTime.Now, DateTime.Now.AddMinutes(30),Login1.RememberMeSet,"", FormsAuthentication.FormsCookiePath);
         
         string encTicket = FormsAuthentication.Encrypt(ticket);
         Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));
      }
   }

Ergebnis war, dass er nach der Weiterleitung das Cookie findet und Abmelden anzeigt aber sobald ich auf eine andere Seite navigiert habe wurde wieder Anmelden anzeigt.

Hatte erst gedacht es wäre ein Problem mit der Gültigkeitsdauer und habe das Cookie auf 30 Min gesetzt, dass hatte aber keine Auswirkung.

21.06.2011 - 09:02 Uhr

Wenn ich den MSDN Eintrag richtig verstanden habe sollte das vom Login Steuerelement gemacht werden, wenn ich einen MembershipProvider angebe.

Aber ich hab es auch mit


   protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
   {
      e.Authenticated = Membership.ValidateUser(Login1.UserName, Login1.Password);
   }

versucht Benutzer wird zwar angefragt und bestätigt, aber danach nicht wieder erkannt.

20.06.2011 - 17:21 Uhr

Hab ich bereits überprüft:
Die ValidateUser Metode wird mit den richtigen Daten aufgerufen und liefert auch True zurück.

20.06.2011 - 16:57 Uhr

Hi,

ich habe einen eigenen MembershipProvider erstellt um Benutzer gegen
meine Datenbank authentifizieren zu können.

Ich habe ihn bis jetzt als Quelle für die BasicAuth meines WebServices verwendet.

Nun möchte ich ihn auch für die FormsAuthentication verwenden, hier gibts aber noch Probleme.

Ich hab eine LoginPage mit dem LoginControl erstellt, in der Membership Property meinen Membership Provider
gesetzt und in den Master ein LoginStatus gepackt um zu sehen ob es geklappt hat.


<membership defaultProvider="Membership">
  <providers>
    <add name="Membership"    type="Security.MembershipProvider,    
        SecurityProvider" />
  </providers>
</membership>
<roleManager enabled="true" cacheRolesInCookie="true"  
  defaultProvider="Roles">
  <providers>
    <add name="Roles" type="Security.RolesProvider, SecurityProvider" />
  </providers>
</roleManager>
<authentication mode="Forms">
  <forms cookieless="UseCookies" domain="localhost" loginUrl="login.aspx" name=".ASPWEB" path="/" protection="All" 
      requireSSL="false" slidingExpiration="true"  timeout="30"/>
</authentication>

Wenn ich mich nun über die Login Seite anmelden will werden Benutzername und Passwort über meinen MembershipProvider geprüft und dieser liefert TRUE zurück.

Ich werde weitergeleitet auf die Default.aspx aber der Loginstatus zeigt noch anmelden.

Versuche haben gezeigt, dass auch Context.User.Identity.IsAuthenticated False zurück liefert und der Context.User.Name == "" ist.

Hat jemand eine Idee woran das liegen kann?
Hab ich irgendwo etwas vergessen?

Besten Dank.
Gruß, SkySurfer

17.11.2010 - 17:33 Uhr

Habe zur DLL leider nur die Lib.
Also muss ich mir wohl die Arbeit machen und einen Wrapper in mannaged C++ schreiben...

Hatte gehofft ich könnte mir das sparen.

Danke

17.11.2010 - 15:32 Uhr

Hi,

ich versuche eine unmanaged C++ DLL einzubinden und hänge gerade etwas..

Habe von der DLL die Header Datei in der ist die Funktion die ich brauche auch definiert:


BOOL ParserInit(char *);

leider nicht als extern C noch mit _declspec (dllimport) was die sache etwas verkompliziert.

habe mir mit bindump den EntryPoint rausgesucht und dann die Funktion in meinen Code eingebunden :


      [DllImport("MdtParser.dll", EntryPoint = "?ParserInit@@YAHPAD@Z", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto, ExactSpelling = true)]
      private static extern bool ParserInit(StringBuilder outBuffer);

Wenn ich diese dann aufrufe bekomme ich folgende Meldung :


Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

Habe auch schon CallingConvention = CallingConvention.Cdecl probiert und die gleiche Meldung bekommen.

Hat noch jemand eine Idee was man noch machen kann?

Gruß SkySurfer

05.08.2010 - 12:08 Uhr

Hi,

soweit ich weiß ist das CF recht eingeschränkt was die Gestalltung
der grafischen Komponenten angeht, das viele der Funktionen welche
die WM API bereitstellt nicht implementiert sind.

Du kannst also entweder den Button ableiten und die fehlenen Funktionen
nach implementieren oder dir direkt einen eingen Wrapper um die WM API
machen. Wir haben bei unseren Anwendungen die letztere Methode gewählt.

Gruß SkySurfer

13.07.2010 - 15:03 Uhr

Generell gebe ich dir recht in echten Anwedungen sollte man mit Events arbeiten..
das oben war auch nur ein Beispiel zum nachvollziehen.

Das Problem ist durch Events aber nicht gelößt.. da es kein Event gibt das einem meldet, dass etwas gesendet wurde und sich das Senden damit auch nicht forcieren lässt. Und das Hauptproblem nicht ist, dass ich ein Timeout beim empfangen bekommen,
sondern dass das Zeichen erst garnicht rausgesendet wird. Problem scheint bei XP zu sein, dass erst ab mehr als einem Zeichen im Puffer gesendet wird.

Habe mir jetzt mit dem Hack beholfen die WriteBufferSize auf 1 zu setzen, beim Öffnen abzuprüfen, ob die Verbindung offen ist und wenn ja die Exception zu unterdrücken. Und anstatt

serialConnection.Write("V"); 

verwende ich

serialPort.Write(new char[] { 'V' },0 ,1);

in dieser Kombination läuft das Übertragen von einzelnen Zeichen sowohl unter XP als auch auf Win7.

Gruß SkySurfer

13.07.2010 - 13:39 Uhr

Hi,

ich versuche gerade mit .net 2.0 und SerialPort eine serielle Kommunikation aufzubauen und bin dabei unter XP auf folgendes Problem gestoßen, welches auf meinem Win7 Rechner erst garnicht auftritt:


serialPort.Write("V");
char c = (char)serialPort.ReadChar(); // read echo

wirft ReadChar ein Timeout weil Write das Zeichen wohl noch nicht gesendet hat.

Bisher hab ich versucht dazwischen ein

serialPort.BaseSteam.Flush();

oder ein

Thread.Sleep(time);

aufzurufen beides ohne Erfolg. Der Writebuffer wird nicht übertragen.

Dabei den versuchen habe ich noch ein sehr Merkwürdige verhalten entdeckt:

wenn man

serialPort.WriteBufferSize = 1; 

setzt bekommt man beim Open() eine Exception, dass der Port nicht geöffnet werden kann. serialPort.IsOpen meldet aber true. Und man kann danach auch senden und empfangen. Und da der Puffer nach einem Zeichen voll ist wird er auch übertragen. Seitzt man die WriteBufferSize = 2 tritt beim Open() keine Exception auf jedoch wird dann auch das einzelne Zeichen nicht mehr gesendet.

Das lustige an der Geschiche: MSDN sagt zu WriteBufferSize Werte unter 2048 werden ignoriert...

Möchte also nicht unbedingt die Exception wegfangen und drauf hoffen das dieser "Fehler" auf jedem System funktioniert.

Gibt es eine Möglichkeit ein Zeichen sicher abzusenden, welche sowohl unter XP als auch Win7 funktioniert?

Gruß SkySurfer

06.07.2010 - 11:55 Uhr

Hi,

ich habe das ExtendedFileDialog von codeproject verwendet und hab unter Win7 x64 das Problem, dass die Events nicht feuern. So wie es aussieht geht beim Hook der die WMs
verarbeitet etwas schief. Hat das vielleicht schon jemand gelößt?

Gruß
SkySurfer

29.03.2010 - 10:30 Uhr

Also mein jetziger Ansatz wäre es einen Brush abzuleiten und den Farbverlauf selbst zu berechnen als ähnlich wie man dann dann bei 3.0 machen würde über kleine Integrationsschrittweite ..

29.03.2010 - 09:12 Uhr

naja also im prinzip soll der verlauf dem kurvenpfad folgen..

das wie würde mich jetzt auch interessieren 😉

22.03.2010 - 16:57 Uhr

Hi,

ich versuch gerade eine Prozentanzeige in Form eines Rings zu machen...
einfarbig soweit auch kein Problem.


g.DrawArc(_pen, _drawingRect, _startAngle, _percentAngle);

Jedoch hätte ich den Ring gerne mit einem Gradientenfarbverlauf versehen.
Also irgendwie in der Art:


GraphicsPath path = new GraphicsPath();
path.AddArc(_drawingRect, _startAngle, _percentAngle);
path.FillMode = FillMode.Winding;

PathGradientBrush brush = new PathGradientBrush(path);
brush.WrapMode = WrapMode.Clamp;
ColorBlend cb = new ColorBlend();
cb.Colors = new Color[] { Color.Blue, Color.Aquamarine };
cb.Positions = new float[] { 0.0f, 1.0f };
brush.InterpolationColors = cb;
_pen = new Pen(brush, _thicknes);

Jedoch hätte ich gern das der Farbverlauf dem Arc folgt und nicht zur Mitte hin verläuft.
Gibt es da eine Möglichkeit?

Besten Dank im voraus

24.02.2010 - 15:31 Uhr

Das erinnert mich an die Aktivierung eines nicht näher genannten Softwareriesen dessen Aktivierung jeweils eine Quersumme von 7 ergeben musst 😉

Ist ja Klar das es ewig dauert... bis du zufällig eine Zahl zusammengebaut die deinen Anforderungen entspricht.

1097 -794 = 303 Zielbereich

5 * 43 = 215
5 * 290 = 1450

1450 - 215 = 1235 Quellbereich

215 / 1235 = 0.174089069 Wahrscheinlichkeit eine passende Zahl pro Versuch zu finden.

Vielleicht nicht ganz Ideal deine Methode...

11.09.2009 - 14:07 Uhr

Hi,

ich hab eine XML Datei in folgender Struktur


<a>
  <b>
    <c>
      <d>1</d>
      ...
    </c>
    <c>
      <d>2</d>
    </c>
  </b>
</a>

da d keine Attribute hat muss ich auf den Knoteninhalt testen.

Mein Idee war etwas in der Richtung:


//child::c[d = "1"]

liefert jedoch leider kein Ergebnis. Hat jemand eine Idee wie ich das lösen könnte?

Gruß SkySurfer

01.09.2009 - 08:48 Uhr

Prinzipiell dürfe das schon möglich sein.. ich denke aber das der Zählerstand eine Sache des Herstellers ist und du schauen musst, wie du über dessen Treiber API die Werte bekommst.

Also ohne genauere Info über die Geräte werden wir dir nicht viel weiter helfen können.

Gruß SkySurfer

27.08.2009 - 15:37 Uhr

WSE hat ab Version 2.0 ein integrierten Schutz vor DoS Attacken..
Blöd wenn er den eigenen Datentransfer auch als DoS erkennt aber die Exception nicht nach außen weiter gibt...

mit dem app.config Eintrag


<maxMessageLength value="1024" /> 

lässt sich die zugelassene Datenmenge angeben. Mit -1 wird der DoS Schutz deaktiviert.

27.08.2009 - 10:52 Uhr

Hab das ganze jetzt mal auf SoapMethod und SoapClient umgebaut und bekomme jetzt zumindest ein Timeout und das Logging auf der Serviceseite liefert eine Fehlermeldung:


            <faultcode>soap:Server</faultcode>
            <faultstring>System.Web.Services.Protocols.SoapHeaderException: Server unavailable, please try later ---&gt; System.IO.IOException: WSE2150: Write Failure. ---&gt; System.Net.Sockets.SocketException: Eine vorhandene Verbindung wurde vom Remotehost geschlossen
   bei System.Net.Sockets.Socket.EndSend(IAsyncResult asyncResult)
   bei Microsoft.Web.Services3.Messaging.SoapTcpNetworkStream.EndWrite(IAsyncResult asyncResult)
   --- Ende der internen Ausnahmestapelüberwachung ---
   bei Microsoft.Web.Services3.Messaging.SoapTcpNetworkStream.EndWrite(IAsyncResult asyncResult)
   bei Microsoft.Web.Services3.Messaging.SoapTcpNetworkStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   bei System.IO.Stream.WriteByte(Byte value)
   bei Microsoft.Web.Services3.Messaging.Framing.FramingRecord.WritePadding(Stream stream, Int32 bytesWritten)
   bei Microsoft.Web.Services3.Messaging.Framing.FramingRecord.WriteChunkedPayload(Boolean endOfRecord, Boolean endOfMessage, Byte[] bytes, Int32 offset, Int32 count)
   bei Microsoft.Web.Services3.Messaging.Framing.FramingRecord.WriteChunkedPayload(Boolean endOfRecord, Boolean endOfMessage)
   bei Microsoft.Web.Services3.Messaging.Framing.FramingRecord.Close(Boolean endOfMessage)
   bei Microsoft.Web.Services3.Messaging.Framing.FramingStream.Close()
   bei Microsoft.Web.Services3.Mime.MimeWriter.Close()
   bei Microsoft.Web.Services3.Mime.XopPackageWriter.WriteAnyExtractedContent()
   bei Microsoft.Web.Services3.Mime.XopPackageWriter.WriteFullEndElement()
   bei System.Xml.XmlElement.WriteTo(XmlWriter w)
   bei System.Xml.XmlDocument.Save(XmlWriter w)
   bei Microsoft.Web.Services3.Mime.XopDocument.SaveToXopPackage(Stream stream, String infosetContentType, String boundary, String startId)
   bei Microsoft.Web.Services3.Messaging.SoapMtomFormatter.SerializeMessage(Stream stream, SoapEnvelope envelope, String mimeBoundary, String startId)
   bei Microsoft.Web.Services3.Messaging.SoapMtomFormatter.Microsoft.Web.Services3.Messaging.ISoapFormatter.Serialize(SoapEnvelope envelope, Stream stream)
   bei Microsoft.Web.Services3.Messaging.SoapMtomFormatterWithFraming.Microsoft.Web.Services3.Messaging.ISoapFormatter.Serialize(SoapEnvelope envelope, Stream stream)
   bei Microsoft.Web.Services3.Messaging.SoapTcpConnection.SerializeMessage(SoapEnvelope envelope)
   bei Microsoft.Web.Services3.Messaging.SoapTcpTransport.Send(SoapEnvelope envelope, EndpointReference destination)
   bei Microsoft.Web.Services3.Messaging.SoapTcpOutputChannel.Send(SoapEnvelope message)
   bei Microsoft.Web.Services3.Messaging.SoapReceiver.DispatchMessage(SoapEnvelope message)
   bei Microsoft.Web.Services3.Messaging.SoapReceiver.ProcessMessage(SoapEnvelope message)
   --- Ende der internen Ausnahmestapelüberwachung ---</faultstring>
            <faultactor>soap.tcp://chimera/SyncService</faultactor>
          </soap:Fault>

Google erzählt mir dazu leider gar nichts. Reflector bringt mich zu der Einsicht, dass der Socket unerwartet geschlossen wurde.

Die Protokollierung des Clients zeigt garkein Fehler.

Hat jemand ne Idee was man noch versuchen könnte bzw. woran es liegen kann?

26.08.2009 - 15:30 Uhr

Hi,

ich habe einen Datentransfer zwischen einem als WindowsService gehosteten Webservice und einem Client, beide verwenden WSE3 und das soap.tcp Protokoll.

Die Kommunikation zwischen beiden funktioniert soweit.
Jedoch bricht die Übertragung ab einer bestimmten SOAP Envelope größe einfach ab und der Client wartet ewig auf die Antwort vom Service und die Anwendung friert ein.
Es greift komischer Weise auch kein Timeout bei der Funktion : Microsoft.Web.Services3.WebServicesClientProtocol.Invoke(<WebMethodName, <ParameterObject>).

Ich hab mir das mal mit Wireshark angeschaut und der TCP Stream zum Client reißt einfach mitten im Envelope ab.

Ich hab leider keine Einstellungen bezüglich irgendwelcher Transfergrößen oder deren Dauer gefunden.

Hat jemand eine Idee woran das liegen könnte?

Gruß SkySurfer

26.08.2009 - 15:20 Uhr

Die mit wsewsdl3 Tool generierte Proxyklasse für soap.tcp funktioniert erst ab einem Framework ≥ 3. Da auf Funktionen zugegriffen werden, die im 2.0 NotImplementetExceptions werfen.

Wenn man die VisualStudio Integration von WSE3 aktiviert und einen Webverweis erzeugt wird funktionierender Code generiert.

25.08.2009 - 08:52 Uhr

Nach einigen Reflector Sessions weiß ich nun wieso es nicht geht ..

man endet beim deserialisieren immer in einem Aufruf von throw new NotImplementetException der in einem try / catch Block gekapselt ist und das auch nicht nach außen liefert.

Prädikat : 🙄

21.08.2009 - 13:58 Uhr

Hi,

ich versende in XML serialisierte Objekte als soapEnvelopes unter Verwendung des WSE3.

Das Objekt hat den folgenden Typ:


[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://tempuri.org/")]
public partial class GetSchemaDTO
{
    private string[] _tableNames;
    public string[] TableNames
    {
        get { return _tableNames; }
        set { _tableNames = value; }
    }

    private SyncSession _syncSession;
    public SyncSession SyncSession
    {
        get { return _syncSession; }
        set { _syncSession = value; }
    }
}

serialisert bekomme ich davon folgende Envelope:


<soap:Envelope xmlns:xop="http://www.w3.org/2004/08/xop/include" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
      <soap:Header>
            <wsa:Action>http://tempuri.org/GetSchema</wsa:Action>
            <wsa:MessageID>urn:uuid:30a74143-212c-4ece-991f-2ed085e41853</wsa:MessageID>
            <wsa:ReplyTo>
                  <wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address>
            </wsa:ReplyTo>
            <wsa:To>soap.tcp://localhost/SyncService</wsa:To>
            <wsse:Security>
                  <wsu:Timestamp wsu:Id="Timestamp-b2aa3487-93ec-41ac-b192-84115851ce30">
                        <wsu:Created>2009-08-21T07:58:23Z</wsu:Created>
                        <wsu:Expires>2009-08-21T08:03:23Z</wsu:Expires>
                  </wsu:Timestamp>
            </wsse:Security>
      </soap:Header>
      <soap:Body>
            <GetSchemaDTO xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/">
                  <TableNames>
                        <string>Testtable</string>
                  </TableNames>
                  <SyncSession>
                        <OriginatorId>0</OriginatorId>
                        <ClientId>aa86afc5-12f4-48b1-9ad6-3f9cc3098b26</ClientId>
                  </SyncSession>
            </GetSchemaDTO>
      </soap:Body>
</soap:Envelope>

Wenn ich die empfangene Envelope aber wieder deserialisieren möchte bekomme ich nur null als Ergebnis.

Beispiel für die Deserialisierung:


            SoapServerMethod serverMethod = new SoapServerMethod(typeof (SyncService),
                                                                 new LogicalMethodInfo(
                                                                     typeof (SyncService).GetMethod("GetSchema")));    

            SoapEnvelope envelope = new SoapEnvelope();
            envelope.LoadXml(
                "<soap:Envelope xmlns:xop=\"http://www.w3.org/2004/08/xop/include\" xmlns:wsa=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\" xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\" xmlns:wsu=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"><soap:Header> <gekürzt> ");

            XmlReader bodyReader = envelope.GetBodyReader();
            object[] objArray = null;



            if (bodyReader != null)
            {
                if (bodyReader.IsEmptyElement)
                {
                    objArray = new object[0];
                }
                else
                {
                    bodyReader.ReadStartElement(bodyReader.LocalName, bodyReader.NamespaceURI);
                    bodyReader.MoveToContent();
                    objArray = (object[])serverMethod.ParameterSerializer.Deserialize(bodyReader, (serverMethod.BindingUse == SoapBindingUse.Encoded) ? envelope.CurrentSoap.EncodingStyle : null);
                }
                bodyReader.Close();
            }

Hat jemand eine Idee woran es liegen könnte ?

Gruß SkySurfer

20.08.2009 - 15:47 Uhr

Der Proxy muss als soapClient erstellt werden dann funktioniert es.
Da die Remoteproceduren jedoch mehr als 1 Parameter benötigen habe ich
DTO's für jede Methode erzeugt. die die Parameter halten.

z.B diese:


public class GetSchemaDTO 
{   
    private string[] tableNamesField;
    private SyncSession syncSessionField;
    
    public string[] TableNames {
        get {
            return this.tableNamesField;
        }
        set {
            this.tableNamesField = value;
        }
    }
    
    public SyncSession SyncSession {
        get {
            return this.syncSessionField;
        }
        set {
            this.syncSessionField = value;
        }
    }
}

Diese wird gefüllt und über den Proxy versendet.
Jedoch kommt beim Service als Übergabeparameter nur NULL an.
Woran kann das liegen?
Benötigt die Klasse noch irgendwelche Attribute?

Gruß SkySurfer

19.08.2009 - 16:42 Uhr

Hi,

ich hab ein Webservice erstellt, welchen ich als Windowsdienst laufen lassen möchte.
Dafür habe ich ihn mittels WSE3 gestartet. Der Dienst läuft und der Webservice ist unter soap.tcp://localhost/Service erreichbar.

Nun habe ich eine Proxyklasse mit wsewsdl3 erzeugt.
Da meine WebMethods teilweise mehr als 1 Übergabeparameter haben(das kann ich nicht ändern) habe ich die Proxyklasse als WebClient erzeugt. SoapClient kann ja nur WebMethods mit 0 - 1 Übergabeparametern handeln.

Nach dem einbinden der Proxyklasse konnte ich mein Projekt starten, jedoch wenn es zum Verbindungsaufbau mit dem dem Service kommt, erhalte ich eine Exception "Unbekanntes URI-Prefix".

Es scheint als könnte ein webClient mit den "soap.tcp" Prefix nichts Anfangen.

Hat jemand Erfahrung damit?

Gruß SkySurfer

17.08.2009 - 17:34 Uhr

Hi,

ich weiß nicht wie du das genau darstellen willst.. aber wenn es wie in einem Downloadmanager sein soll würde ich dir ein Grid empfehlen. Die kannst du ziemlich einfach um Zeilen erweitern. Spontan würde mir da das SourceGrid einfallen, dass hat schon die Möglichkeit eine Progressbar darzustellen integriert.

Gruß SkySurfer

16.08.2009 - 23:04 Uhr

Hab es auf Vista mit deaktiviertem UAC und auch auf XP versucht. Aber in beiden Fällen schreibt er nichts in die config Datei.

16.08.2009 - 02:50 Uhr

Nein bekomme keine Exception die rechte müssten passen und alle Dateien liegen im selben Verzeichniss das es auch kein Problem mit den Pfaden sein kann ..

Ich habe eher die Vermutung, dass das ändern des XML Werts von Config.Save nicht registriert wird und deshalb die Datei nicht neu geschrieben wird.

14.08.2009 - 14:31 Uhr

Hi,

ich habe einen WindowsService geschrieben. Um diesen konfigurieren zu können habe ich habe ich eine Methode zun ändern der ApplicationSettings des Services geschrieben.
Das auslesen funktioniert soweit, jedoch beim ändern der Werte werden diese nicht in zurückgeschrieben.

Hat jemand ne idee woran das liegen kann?


   public static void Update(string applicationConfigPath, string key, string value)
        {
            ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();

            fileMap.ExeConfigFilename = applicationConfigPath;

            Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);

            ConfigurationSectionGroup configGroup = config.SectionGroups["applicationSettings"];
            
            if (configGroup == null) return;
            
            ClientSettingsSection settingsSection = (ClientSettingsSection) configGroup.Sections["MaxLogger.Properties.Settings"];
            SettingElementCollection elements = settingsSection.Settings;
           
            foreach (SettingElement element in elements)
            {
                if (element.Name != key) continue;
                element.Value.ValueXml.InnerText = value;
                break;
            }

            config.Save();

            ConfigurationManager.RefreshSection("applicationSettings");
        }

29.07.2009 - 16:59 Uhr

Hi,

du kannst versuchen die DLL direkt aus dem Explorer per Drag&Drop in die Toolbox aufzunehmen damit hatte ich noch nie Probleme.

Gruß SkySurfer

29.07.2009 - 12:16 Uhr

Hi,

dies Funktion feht im CF.

Du musst sie dir selbst bauen. Ich pack die einstellungen meist in eine Resourcedatei,
habe aber auch schon ansätze gesehen wo leute einen eigenen Parser für eine app.config geschrieben haben wie z.B. hier.

Gruß SkySurfer

29.07.2009 - 11:58 Uhr

Hi Costa,

deine Vermutung ist richtig. Der beste weg wird wohl über WMI führen.
Wie du WMI ansprichst hab ich bereits in einem anderen Beitrag beschrieben.

Dort musst du prinzipiell nur das WQL Statement abändern. Ein Link zur WMI Klassenreferenz ist im Beitrag auch enthalten.

Gruß
SkySurfer

02.06.2009 - 15:08 Uhr

Ich weiß nicht wie umfangreich dein Server werden soll..

aber prinzipiell gibt es einige Lexer/Parser Generatoren die dir auch C# Code erzeugen.

Spontan würden mir
*ANTLR *MimosseCC *GOLD

einfallen und es gibt sicher noch andere...

Gruß SkySurfer

27.05.2009 - 16:58 Uhr

Es ist nicht ganz so einfach wie bei Textboxen, das Labels von selbst kein Drag auslösen.

Das muss man sich selbst stricken. Ich hab es im Beispiel mit link aufs Label klicken gemacht. Man kann aber auch MouseLeave oder ähnliches machen.


        private void label2_DragDrop(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(typeof(String)))
            {
                label2.Text = (string)e.Data.GetData(typeof (String));
            }

        }


        private void label1_MouseDown(object sender, MouseEventArgs e)
        {
            DoDragDrop(label1.Text, DragDropEffects.Copy);
        }



        private void label2_DragOver(object sender, DragEventArgs e)
        {
           e.Effect = DragDropEffects.Copy; 
        }

27.05.2009 - 16:26 Uhr

Hi 7ero,

Für die Verknüpfung deiner Klasse gibt es die Tag-Eigenschaft.


ListViewItem.Tag = myFileclass

Dann hält jedes Item in der Listview die Referenz auf das zugehörige Fileclass Objekt.
das du auch jederzeit wieder aus dem Tag lesen kannst.


Fileclass myFileClass = (Fileclass)ListViewItem.Tag;

Die Spalten erzeugst du bei ListView durch das hinzufügen von SubItems zu deinem Item. Wenn du also die Binding Soruce überschreibst musst du bei Erzeugen des Items aus den entsprechenden Properies von FileClass SubItems erzeugen.

Gruß SkySurfer

27.05.2009 - 13:45 Uhr

Stimme ich Herbivore zu

das was mein Versuch:



        private void Software(string rechner, ConnectionOptions options)
        {
           
            string[] properties = new string[] { "DisplayName", "Publisher", "InstallDate" };

            try
            {

                /* Rechner & options wird beim starten der anwendung übergebe.
                 *
                 *
                 *
                 *const uint CLASSES_ROOT = 0x80000000;
                 *const uint CURRENT_USER = 0x80000001;
                 *const uint USERS = 0x80000003;
                 *const uint CURRENT_CONFIG = 0x80000005;
                 */
                const uint LOCAL_MACHINE = 0x80000002;

                foreach(string property in properties)
                {
                       listView3.Columns.Add(property);
                }

                ManagementScope myScope = new ManagementScope("\\\\" + rechner + "\\root\\default", options);
                ManagementPath mypath = new ManagementPath("StdRegProv");
                ManagementClass mc = new ManagementClass(myScope, mypath, null);

                ManagementBaseObject inParams = mc.GetMethodParameters("EnumKey");
                inParams["hDefKey"] = LOCAL_MACHINE;
                inParams["sSubKeyName"] = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
                // inParams["sValueName"] = "ProgramFilesDir";

                ManagementBaseObject outParams = mc.InvokeMethod("EnumKey", inParams, null);


                foreach (string m in (string[])outParams["sNames"])
                {


                    ManagementBaseObject inParamsSN = mc.GetMethodParameters("GetStringValue");
                    inParamsSN["hDefKey"] = LOCAL_MACHINE;
                    inParamsSN["sSubKeyName"] = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + m.ToString();

                    ListViewItem item = null;
                    

                    foreach (string property in properties)
                    {

                        inParamsSN["sValueName"] = property;

                        ManagementBaseObject outParamsSN = mc.InvokeMethod("GetStringValue", inParamsSN, null);
                        if(item == null)
                        {
                            item =
                                new ListViewItem(outParamsSN["sValue"] != null
                                                     ? (string) outParamsSN["sValue"]
                                                     : m.ToString());

                        }
                        else
                        {
                            item.SubItems.Add(outParamsSN["sValue"] != null
                                                  ? (string) outParamsSN["sValue"]
                                                  : m.ToString());
                        }
                    }

                    listView3.Items.Add(item);

                }



            }
            catch (Exception ex)
            {
                Exc(ex);
            }

27.05.2009 - 09:53 Uhr

Hi,

ich bin mir nicht ganz sicher was du mit "kompletten Werte" meinst.
Ich hab das mal bei mir gestartet und bekomme eine vollständige Liste der installierten Software. Das kann es also nicht sein was du meinst ?

Gruß SkySurfer

27.05.2009 - 09:40 Uhr

Hallo,

ich hab ein Control für das CompactFramework erstellt.
Diese benötigt Nativefunktionen des Systems.
Da die Funktionen im Designer auf dem PC aus der user32.dll stammen auf
Windows Mobile aber aus der core.dll musste ich meine C++ dll welche die nativen Funktionen meinem Control bereitstellt einmal gegen die user32.dll linken und einmal gegen die core.dll

Nun mein Problem:
Wie kann ich meinem Control sagen, dass es im Designer die gegen user32.dll gelinkte dll verwenden soll, auf das Windows Mobile Gerät aber die gegen core.dll gelinkte dll verteilt?

In einem Beispiel für CF 1.0 hab ich auf der MSDN-Seite folgendes gefunden:
Hier werden 2 Assemblies erzeugt eine für den Designer und eine für das CF
Die Designer Assembly verweist auf RuntimeAssembly.


#if NETCFDESIGNTIME
[assembly: System.CF.Design.RuntimeAssembly(
  "MyControl, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null ")]
#endif 

Ab CF 2.0 wird das ganze wohl über die DesignTimeAttributes.xmta laufen?

Leider hab ich aber hier noch kein Attribut gefunden mit dem ich angeben könnte welche DLL mitverteilt werden soll.

Gibt es noch andere Möglichkeiten?

Gruß SkySurfer

19.05.2009 - 10:23 Uhr

Hi,

ich hab ein Control für den CF entworfen das soweit auch funktioniert.
Seit ich im Control eine Klasse verwende, die von MessageWindow erbt wird es im
Designer nicht mehr angezeigt sondern nur noch als grauer Kasten angezeigt in dem der Klassenname steht.

Wie kommt dass? Kann man das verhindern?

Gruß SkySurfer

19.05.2009 - 10:07 Uhr

Das Zauberwort ist WMI (Windows Managemant Instrumentation)
Dieser Service ist zum System Monitoring gedacht.

Damit kann man mit WQL (wie SQL) Befehlen das System abfragen.



using System.Management;

...

            string temp = "";
            System.Management.ObjectQuery query = new ObjectQuery("SELECT * FROM MSAcpi_ThermalZoneTemperature");
            System.Management.ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
            System.Management.ManagementObjectCollection collection = searcher.Get();
            foreach(ManagementObject obj in collection)
            {
                temp += "Temp : " + obj["CurrentTemperature"].ToString() + " ";

            }
...

hab den jetzt nicht getestet.. aber das Schema sollte klar werden.

Die Referenz dazu findet ihr in der MSDN

WMI ist eine Implementierung des CIM Standard es funktioniert also für alle Systeme auch Linux, MacOSx und was sich da noch so draußen rum treibt 😉

Also Finger weg von dem proprietären Zeugs wenn es nicht wirklich sein muss!

Gruß SkySurfer

19.05.2009 - 09:39 Uhr

Das Problem lag in der nativen DLL.
Eine DLL von der meine abhängig war konnte auf dem Gerät nicht gefunden werden.
Das Problem habe ich mit Dependency Walker gefunden.

Vielleicht hilfts ja jemand in Zukuft 😉

Gruß SkySurfer

15.05.2009 - 14:19 Uhr

Hi,

ich hab auf dem CF 2.0 ein Problem mit dem PInvoke:

ich habe eine native DLL erstellt die beim Deploy auch in das Verzeichnis meiner CF Anwendung kopiert wird.

Die DLL stellt die entsprechenden Einprungspunkte bereit:


    ordinal hint RVA      name

          1    0 00001270 Subclass
          2    1 00001300 Unsubclass

Habe in meiner CF Anwendung die Zugriffpunkte auf die DLL definiert:


        [DllImport("CFNative.dll")]
        private extern static void Subclass(IntPtr subclassWindow,
                                            IntPtr messageWindow);

        [DllImport("CFNative.dll")]
        private extern static void Unsubclass(IntPtr subclassWindow);

Wenn ich das Projekt übersetzte und im Emulator starte bekomme ich folgende Fehlermeldung :

Can't find PInvoke DLL 'CFNative.dll'.

Woran kann das noch liegen?

Gruß SkySurfer

12.05.2009 - 13:03 Uhr

So wie es aussieht löst die PictureBox unter CF 2.0 nun das PaintEvent aus.
Die Textbox aber leider immer noch nicht 😦

Es geht mir bei dem Event aber nicht ums selber zeichnen sondern um den Zeitpunkt,
da ein Control das eingefügt wir beim einfügen noch keine Location hat und Paint das erste Event ist, dass alle auslösen und bei dem die Location gesetzt ist.

@ herbivore: ControlStyles gibt es meines Wissens nach noch in keiner Version des CF oder gibt es das im 3.5 jetzt?