Laden...

Forenbeiträge von mosspower Ingesamt 456 Beiträge

20.03.2010 - 22:05 Uhr

Ich mache das immer auf die "althergebrachte Art" mit IConfigurationSectionHandler - hatte damit noch nie Probleme. Bekomme eben den kompletten Knoten und muss mich halt dann selbst ums Mapping kümmern.

20.03.2010 - 21:49 Uhr

Mach die Methode einfach nicht statisch und gut ist.

Also gibt es keine Möglichkeit einen Verweis auf ein bereits vorhandenes Objekt zu "legen"? Muss man immer ein neues Objekt erstellen?

suchst Du vielleicht sowas?



private static void ChangeText(Form form, String labelName) {
  // Who cares about Nullpointers?
  ((Label)form.Controls.Find(labelName, true)[0]).Text = "Gurke";
}

private void cmdChange_Click(object sender, EventArgs e) {
  ChangeText(this, lbtText.Name);
}

20.03.2010 - 21:37 Uhr

In C (oder C++) ist es jederzeit möglich, eine physikalische Speicheradresse auf einen Pointer zu mappen. Dieser kann dann auf Instanzvariablen usw. des Objektes zugreifen.
Man könnte, jetzt mal den Sinn einer solchen Aktion außer acht gelassen, einer statischen Methode die Speicheradresse übergeben.

Ist aber in C# nicht möglich, denn ...

... in C# pointer can only be declared to hold the memory address of value types and arrays...

>

20.03.2010 - 18:50 Uhr

@winSharp93,

OK, dann eben nicht OT.

Die 0.001% wären doch eine (aber nicht die) Lösung auf die Ausgangsfrage des Threaderstellers. Jetzt habe ich mich gefragt, ob dies überhaupt in C# möglich ist.

Komme ich via C# von einer Adresse auf einen Pointer und dann auf z.B. ein Property?

Wenn ja, was ich nicht glaube, wie?

20.03.2010 - 18:35 Uhr

[EDIT=herbivore]Abgeteilt von [C#] aus statischer Methode auf Objekt zugreifen[EDIT]

Die Frage ist vielleicht ein bißchen OT, aber passt so schön hier rein.

Kann man denn eigentlich via C# im unsafe Modus bei einer vorhandenen Adresse einen Pointer zuweisen, der auf ein Control, wie hier z.B. Label, zeigt?

19.03.2010 - 17:42 Uhr

LOL, genau das war der Grund, warum meine E-Mails gegenwärtig überprüft werden, bevor ich die zum Kunden schicken darf 😉 ... naja, so krass ist es nicht, aber da hat es schon gewaltig gescheppert bis nach ganz oben.

Die bringen auch Fehler zurück in einer ErrorCollection, wo dann als Text sehr oft drinnen steht, dass ein Fehler passiert ist, aber nicht näher spezifiziert. So nach dem Motto, immer der gleiche Fehlercode und die Meldung, Hallo, es ist ein Fehler passiert.

Der absolute Hammer ist, dass die die Fehler mitloggen in der DB und ich als Benutzer muss dann anrufen und ggf. manuell eingreifen, bzw. Fragen, welcher Fehler denn bitte aufgetreten ist.

Auch verrückt ist, dass die öfters die Datenbank (Oracle) durchstarten müssen, danach geht es (andere Fehler, nicht die Threadproblematik) dann wieder 8o ?( HALLO!

Naja, die bringe ich schon noch auf Vordermann 🙂

19.03.2010 - 16:03 Uhr

Wir sind die ersten, die die Funktionalität nutzen, aber aus Zeitgründen hat eine Kollegin das mittels Java implementiert.

Jetzt beim Migrieren ist dieser (eigentlich verrückter) Fehler an die Oberfläche gepoppt.

19.03.2010 - 11:16 Uhr

Hallo JAck30lena,

Jesus!, da hätte ich aber auch selbst draufkommen können - vielen Dank!

19.03.2010 - 10:41 Uhr

Im WebException-Response-Header steht:

{Connection: close
Content-Type: text/xml;charset=utf-8
Date: Fri, 19 Mar 2010 09:37:35 GMT
Server: Apache-Coyote/1.1}

Im Original:
HTTP/1.1 500 Internal Server Error
Server: Apache-Coyote/1.1
Content-Type: text/xml;charset=utf-8
Date: Fri, 19 Mar 2010 09:37:35 GMT
Connection: close

Die Fehlermeldung (also HTTP-Response-Body) fehlt:


<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><soapenv:Fault><faultcode>soapenv:Server.userException</faultcode><faultstring>org.xml.sax.SAXParseException: An invalid XML character (Unicode: 0x1b29e0) was found in the element content of the document.</faultstring><detail><ns1:hostname xmlns:ns1="http://xml.apache.org/axis/">gtprint-test</ns1:hostname></detail></soapenv:Fault></soapenv:Body></soapenv:Envelope>

19.03.2010 - 10:29 Uhr

Hallo Hallo JAck30lena,

nein, hier sind keine näheren Informationen vorhanden, im Header-Objekt stehen nur die headerrelevanten Informationen zur Verfügung.

In der Exception-Fehlermeldung steht: The remote server returned an error: (500) Internal Server Error

Im Response der WebException steht noch weniger: Internal Server Error, System.Net.HttpStatusCode.InternalServerError

19.03.2010 - 10:01 Uhr

Hallo JAck30lena,

nein, leider gibt es die nicht, auch steht die gesuchte Information nicht im (einem) Exception Objekt.


webResponse = (HttpWebResponse)this.webRequest.GetResponse();

Das Objekt (hier webResponse) ist leider null. In obiger Zeile wird die Exception geworfen.

19.03.2010 - 09:20 Uhr

Hallo "Kollegen",

gibt es eine Möglichkeit, genauere Fehlermeldungen zu bekommen, wenn z.B. als Response HTTP-StatusCode 500 (Internal Error) geliefert wird.

Ich kann diesbezüglich in dem Exception-Objekt nichts finden.

Untersuche ich den Response mittels Sniffer, dann sehe ich die Fehlermeldung.
Welche Möglichkeit gibt es hier?

Wichtig bei mir ist das aktuell, weil ein Kunde bestimmte Exception im Programm nicht handelt, so könnten wir zumindest sehen, ob es sich um einen Fehler des Ziel-Systems (z.B. Datenbank nicht ansprechbar) handelt oder um fehlerhafte Requestdaten des Clients.

Vielen Danke für evtl. Antworten schon einmal im Voraus.

18.03.2010 - 18:43 Uhr

Erst mal vielen Dank für eure Anregungen und Hilfestellungen.

Das Problem wurde nun ausfindig gemacht, dank Sniffer via WireShark.
Bei jedem Request wird der Envelope im UTF-8-Format erwartet, und die Attachments in Latin-1-Kodierung.

Axis verschlüsselt Sonderzeichen, die nicht explizit als UTF-8 kodiert sind, mittels der Entity-Schreibweise, z.B. wird aus einem ü

&XFC;

Bei den Attachments wird mittels AXIS immer der Latin-Code-1, welcher hier beim ü, auch der gleiche wie bei UTF-8, nämlich FC ist.

Ich habe natürlich bei den Anfragen im Envelope gleich UTF-8 genommen, denn warum soll ich Filtern, es gibt zig Namen, die Sonderzeichen besitzen usw.
Das bedeutet, dass z.B. ein ü im Envelope und in den Attachments als FC übermittelt werden.

Nun muss den Leuten, die die Schnittstelle zur Verfügung stellen, das auch schon aufgefallen sein, und die haben angefangen zu filtern - denn, bei allen bis auf zwei Elementen, funktionieren Sonderzeichen.

Bei den zwei Elementen gingen übrigens nur das kleine ü und das kleine ö nicht - wahrscheinlich im Filter vergessen oder Copy-und-Paste-Fehler.

Die Fehlermeldung, also der Internal Server (500) Error war:

An invalid XML character (Unicode: 0xfc) was found in the element content of the document. 😁

Wirklich sehr peinlich, denn 0xfc steht für ein kleines ü sowohl beim Latin-1-Code, wie auch im UTF-8-Code.

Dieser Fehler (+ Fehlermeldung) hat es somit in meine TOP-5 der verrücktesten Vorfälle in meiner fast 10 jährigen Programmierlaufbahn geschafft.

Dank an euch allen - case closed!

17.03.2010 - 17:35 Uhr

Hallo MrSparkle,

wenn ich ganz ehrlich bin, dann verstehe ich das auch alles nicht mehr.
Das Java-Programm läuft auf einer Windows-Kiste und auch der Server.

Man kann es kurz auf den Punkt bringen:

Ich lese aus einem File eine XML ein (UTF-8-Encoding) und baue damit den Request zusammen. Steht in einem bestimmten Element ein Umlaut, dann kracht es, lösche ich den raus aus dem File und lasse das Programm wieder laufen, dann geht es.

Öffne ich jetzt wieder das File und schreibe einen Umlaut rein, dann kracht es wieder.
Wie gesagt, bezieht sich das alles nur auf ein bestimmtes Element - bei allen anderen gibt es keine Probleme mit den Umlauten.

Noch verrückter ist, dass z.B. morgen oder übermorgen genau das File dann doch geht, also mit Umlauten in dem einen bestimmten Feld.

Ja, das ist soz. der völlige Wahnsinn! (und verstehen muss es nun wirklich niemand)

17.03.2010 - 16:46 Uhr

was ist denn der Unterschied zwischen Request A und Request B?

Hallo MrSparkle,

Wie oben beschrieben, Request a hat Apostroph drinnen und funzzt nicht und in Request b wurde das Apostroph reinkopiert und funktionierte das.

Ich habe den Fehler jetzt gefunden. Immer wenn in einem ganz bestimmten Feld im Attachment-XML ein Umlaut steht (oder sonstige Sonderzeichen), dann knallt es. Kurios ist, dass es manchmal einenen halben Tag später geht und dann wieder erst zwei Tage später, bzw. bei anderen Requests das völlig OK ist. Es kracht aber nur bei dem einen Feld (das nicht mal verwendet wird) ... bei Sonderzeichen, bzw. Umlauten in anderen Feldern (Straße, Ort ect.) fuzzt es und es wird auch das PDF richtig generiert.

Ich habe das weitergeleitet, das können die ausmachen. Ich bin hier mit meinem Latein am Ende. Bin echt mal gespannt was da zurückkommt.

Was erschwerend noch hinzukommt ist die Tatsache, dass es eben beim Java-Programm immer geht.

Das einzige was mir noch einfällt wäre Caching-Problem, aber da habe ich auch schon "rumgespielt" mit den Eigenschaften auf no-cache usw.

17.03.2010 - 09:36 Uhr

OK, vielleicht kann mir jetzt einer helfen bei spezieller Problematik oder jemanden kommt das bekannt vor. Vorab, wie der Header des Aufrufs aussieht:


this.webRequest.Method = "POST";
this.webRequest.ContentType = "multipart/related; type=\"text/xml\"; start=\"<soap-envelope>\"; .boundary=\"----=Path-Separator\"";
this.webRequest.Accept = "application/soap+xml, application/dime, multipart/related, text";
this.webRequest.Headers.Add("Cache-Control", "no-cache");
this.webRequest.Headers.Add("Pragma", "no-cache");
this.webRequest.Headers.Add("SOAPAction", this.xxxConsumerJobCustomConfig.SoapAction);

Jetzt habe ich folgendes herausgefunden:

  1. Request A hat Apostroph im Request -> Aufruf schlägt fehl (Internal Server Error HTTP-Code 500)

  2. Request B wird der Name von Request A, also mit Apostroph hinzugefügt -> Aufruf ohne Fehler, Apostroph steht im PDF File

  3. Jetzt wird es total verrückt. Request A Apostroph wird ersetzt mit XXX -> Aufruf ohne Fehler, PDF Files OK (natürlich steht da XXX)

Jetzt bin ich völlig verwirrt, denn es liegt bei Request A am Apostroph, der aber nicht zu einem Fehler bei Request B führt 8o

Hat jemand schon einmal eine ähnliche Erfahrung gemacht, denn ich komme hier definitiv nicht weiter.

Ich dachte dann noch, dass es ein Caching-Problem ist, was ich jetzt definitiv ausschließen kann, da vorhin auf Anfrage der Server neu gestartet wurde.

16.03.2010 - 20:42 Uhr

Es gibt hier zwei Möglichkeiten, je nachdem, was Du dann weiterhin vorhast:

1, wie User Marduk schon angesprochen:
Du untersuchst den Quellcode, also hier speziell schaust Du dir die JavaScript-Methode callPublish an und rufst diese und nur diese auf und wertest das Ergebnis aus

... oder

2, Du navigierst mit dem Internetexplorer applikationstechnisch, über einen nicht sichtbaren IEXPLORE-Prozess im Hintergrund auf die Ausgangsseite, holst Dir das DOM des XHTML-Dokuments und clickst applikationstechnisch auf den Button und liest dann, nachdem XmlHttpRequest (oder AJAX, wie das seit Web 2.0 heißt) die Seite aktualisiert hat, eben diese dann aus.

16.03.2010 - 16:45 Uhr

Was bedeutet das konkret? Klappt es oder nicht oder nur manchmal? Üblich ist meistens ISO-8859-1 oder ISO-8859-15 (mit €-Zeichen).

Sorry, ich meinte schon Latin-1 (aka ISO-8859-1). Die Typen können mit meinen Fragen nichts anfangen, die haben null Plan - die haben den Service programmieren lassen und das erstellen der PDFs läuft bei denen intern über einen dritten Anbieter. Die schreiben wirklich in ErrorCollections rein, wenn ein Fehler passiert ist die ErrorMessage, Error occurred (das wars, nix weiter!). Es ist zum verzweifeln.

Problem ist halt, warum die sich so langsam bewegen, dass intern eine funktionierende Javalösung vorhanden ist, die quick 'n' dirty "hingezaubert" wurde ... ich darf das jetzt "saubermachen" 🙁 ... würde das auch gern, aber kann ich ja nicht. Das kann 1000 Gründe haben!

Der Ansprechpartner hat mir vorhin bestätigt, dass die Requests richtig sind, also bei Ihnen generiert werden kann und auch heute Vormittag in Produktion ist es auch gegangen, nur wenn ich dann mit .NET "daherkomme" funzzt das nicht (immer).

16.03.2010 - 16:32 Uhr

Sorry, ich sollte genauer lesen.

Die baue ich mir lokal mitels Daten aus Dateien und Datenbank zusammen.
welche über einen Kunden (der vierte hier im Bunde) an uns übermittelt werden.

16.03.2010 - 16:31 Uhr

Hallo MrSparkle,

ja, ich verstehe es auch nicht, ich mache seit Jahren alles über UTF-8, aber es gibt ja Sachen "da draußen" ... X(

verstehen muss er das aber irgendwie schon, denn mit der Java-Lösung gibt es diesbezüglich überhaupt keine Probleme.

Encoding-Default ist bei mir Windows-1252 - Western Europe.

Wenn ich es explizit mit ISO-8859-2 probiere klappt es auch, also PDF passt mit Umlauten, bis eben immer zu den oben genannten Zwischenfällen, dann geht der Aufruf mit 500er Statuscode gar nicht erst (nie) durch.

Bin jetzt seit zwei Tagen über diesen Müll! 😜

16.03.2010 - 16:27 Uhr

Hallo MarsStein,

Aufgrund des Requests werden die Dokumente auf dem Zielsystem generiert und im Response an den Client gesendet.

Problem ist wirklich, und jetzt trage ich hier nicht dicke auf, dass ich für manche Requests den Internal Fehler bekomme und dann für den absolut identischen 10 Minuten später durchkomme - bei manchen, wie eingangs erwähnt, komme ich nich durch (immer 500, wobei das total schwach ist, das bedeutet, dass die Anwendung, an die der Server weitergeleitet hat, hier Tomcat an Servlet, eine unbehandelte Ausnahme wirft ... leider gibt es hier nix, was gelogged wird - aufgrund einer Nachfrage, werden genau diese, also HTTP-Status 500, gar nicht mitgelockt, sind also dem System völlig unbekannt).

Die Requests sollten eigentlich, nach Rücksprache richtig sein.

Problem ist hatl, dass es mit Java läuft, ist ein auf Java optimierter SOAP, also verwendet Java-spezifische Objekte, so dass ich eben das Zeugs plain via SOAP und parsen der Boundaries durchführen muss.

Bei der Java-Lösung ist nix besonderes, außer, dass die Attachments auf der Festplatte in Form von XML-Dateien (ANSI-Default) zwischengelagert werden und AXIS dann den SOAP-Request zusammenbaut, der aber dann hinterher genau so wie der von mir gepostet aussieht, also Axis nimmt bei Java die Arbeit ab, was auf .NET-Ebene WCF machen würde.

16.03.2010 - 16:19 Uhr

@MrSparkle,

ich kann es leider nicht zu 100 % sagen ob es am Encoding liegt.

Es gibt folgenden Sachverhalte nochmal kurz zusammengefasst:

Ich schicke immer den Request mit Encoding.Default, dann passen auch immer die PDF-Dokumente (also die Umlaute), aber nur dann, wenn der Request auch durchgeht, das bedeutet, wenn kein 500-er HTTP-Statusmeldung (Internal Server Error) kommt.

Schicke ich dagegen den Request mit Encoding.UTF-8, dann kann ich zwar immer den Server aufrufen (also kein 500er Error), aber hier passen die Umlaute dafür nie!

16.03.2010 - 16:08 Uhr

@MarsStein,

genau das mache ich ja, ich werte die Boundaries (PDF-Attachments + XML-SOAP-Response-Envelope) aus.

Ich schreibe alles in den Boundaries, die nicht im ersten (hier SOAP-Envelope) mit BinaryWriter wech und das passt auch zu 95 Prozent, nur eben nicht zu 100 Prozent.

Kann mir vielleicht auch mal jemand sowas erklären, wie kann das gehen? Binär und XML-Encodierung Latin-1? 8o


------=Path-Separator
Content-Type: application/octet-stream 
Content-Transfer-Encoding: binary 
Content-Id: <order-attachment-1>  

<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?> ... usw, Content von Attachment für Request ...

Oktett bedeutet doch, dass jedes Zeichen aus genau 8 Bit besteht, oder?

16.03.2010 - 16:05 Uhr

Hier ein Beispiel der Antwort, also des Responses mit 2 Attachments, stark verkürzt.



------=_Part_4178_22893312.1268751536911
Content-Type: text/xml; charset=UTF-8
Content-Transfer-Encoding: binary
Content-Id: <B08CC99DB4B20D379E8DAE54BC091ACD>

<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope />

------=_Part_4178_22893312.1268751536911
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
Content-Id: <3B8F144CD462E190508F662A492A188C>

%PDF-1.3
%????
5 0 obj
<<
/Type/XObject
/Subtype/Form
/FormType 1
/BBox [24.309 16.7898 577.2265 642.3445]
/Matrix [1 0 0 1 0 0]
/Resources <<
/ProcSet 1 0 R
/Font <<
/F 6 0 R 

u.s.w. bis EOF PFD ....


------=_Part_4178_22893312.1268751536911
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
Content-Id: <6AD19309D400706FAD78383ADE550B8E>

%PDF-1.3
%????
6 0 obj
<<
/Type/XObject
/Subtype/Form
/FormType 1
/BBox [69.6605 582.1368 534.7368 700.093]
/Matrix [1 0 0 1 0 0]
/Resources <<
/ProcSet 1 0 R
/Font <<
/F 5 0 R
>>
>>
/Filter/FlateDecode
/Length 509

u.s.w. bis EOF PFD ....

%%EOF

------=_Part_4178_22893312.1268751536911--


16.03.2010 - 15:44 Uhr

Ja, ich bekomme alles im Response-String.

Hier mal ein kleines Bild, über SOAP mit Attachments wie das aussieht.

Hier die Quelle

Moment, ich schicke euch mal gleich ein Original Response!

16.03.2010 - 15:15 Uhr

Als Stream liegen die Daten vor. Ich rufe einen SOAP-Service mittels HttpWebRequest auf und lese dann den gesamten Stream. Hier steht dann alles drinnen (Response-Envelope + Attachments).

Ich weiß nicht, wie der Stream codiert ist. Wie bekommt man das raus?
Bin mir ziemlich sicher, dass er ISO-8859-1 codiert ist.

Gruß

16.03.2010 - 15:06 Uhr

Hallo MarsStein,

ich bin mir nicht ganz sicher ob es am Encoding liegt, denn wie oben beschrieben geht es und dann wieder mal nicht. Ich bin hier völlig ratlos.

Es ist nichts spezifiziert, sondern es wird alles "ausprobiert". Wenn ich Encoding.Default sende oder ISO-8859-1, dann funzzt das mit den Umlauten, aber wie schon beschrieben, nicht bei allen, bzw. bei obigen Beispiel nicht - vielleicht sollte ich mich nicht so auf das Encoding konzentrieren, ggf. ist es was anderes.

Die Fehler sind halt "erste Sahne".

Ich muss lediglich die Attachments mit Latin-1 senden.

Ich habe schon ausprobiert, wenn ich vor dem absenden explizit in UTF-8 umwandele, dann komme ich zwar immer! durch, jedoch sehen dann bei den PDFs die Umlaute eben alle so komisch aus.

Git es eine Möglichkeit herauszufinden, wie ein Stream codiert ist? .. wahrscheinlich hier unterschiedlich. Das Result-Envelop wird UTF-8 sein und die Attachments sind Oktett.

Wenn es eine Möglichkeit geben würde, bei einem BinaryWriter vorher von UTF-8 zu ... ja, zu was eigentlich, zu konvertieren, dann sollte mein Problem auch gelöst sein. Leider finde ich da gerade überhaupt nix.

Gegenwärtig suche ich im Response die PDF-Start-Marker und schreibe alle Attachments mit dem BinaryWriter wech (ohne Format), dann klappt das auch, wie gesagt, nur dann nicht, wenn ich explizit mit UTF-8 den Server aufrufe.

Naja, der Kunde weiß bescheid, vielleicht schickt er mir mal ein paar Fehlermeldungen, aber Server Error 500 ist schon total krass.

16.03.2010 - 12:33 Uhr

Hallo "Kollegen",

ich habe aktuell ein verzwicktes Problem.
Ich schicke mittels HttpWebRequest an eine SOAP-Schnittstelle (ja, ich muss es leider so verwenden, kann kein WCF verwenden, da Java-spezifisch) einen Request, der neben dem Envelope noch aus Attachments besteht (diese müssen ISO-8859-1 sein).

Erst mal mein Problem:
Schicke ich Requests mit bestimmten Sonderzeichen, z.B. é, aber nicht die deutschen Umlaute oder ß, dann verhält sich der Server wie folgt:

Verwandele ich vorher explizit in UTF-8 um, dann steht im Antwortattachment ein komisches Zeichen, dass ich nicht mehr hinbekomme, z.B. aus Patané wird Patané.

Ich muss die Antwort, Type Oktett-Stream, als PDF speichern, hier mache ich einfach einen StreamWriter auf und schreibe die Bytes weg (ohne jegliche Codierung, denn mit so einer funzzt das bei keinem Aufruf).

Wenn ich mit Default-Decoding oder ISO-8859-1 schicke, was ich ohne weiteres bei Umlauten machen kann, dann bekomme ich einen Internal Server (500) Error.

Problem ist, dass sich die Firma, die diesen Service anbietet auch überhaupt nicht auskennt, da die den Service wiederum von einem Drittanbieter haben, da kommen dann genau solche "Witzfehler" zurück oder in einer ErrorCollection steht, dass ein Fehler passiert ist, nur auf Englisch ohne weitere Angaben - von der Firma kann ich also nichts erwarten.

Ich bin jetzt echt verzweifelt hier, da ich schon fast zwei Tage an diesem Phänomän rummache. Es sind nur solche Sonderzeichen, die ja immer mal wieder in Namen vorkommen, Umlaute und Eszett machen keine Probleme. (wenn ich Encoding Default oder ISO-8859-1 bei Umlauten + Eszett verwende dann funzzt es, bei UTF-8 verzieht es beim PDF auch die Buchstaben bei den Umlauten, bzw. beim Eszett).

Problem ist auch, dass ich eine Java-Applikation portiere und mit genau dieser funzzt es ohne dass irgendswelche Codierungen übergeben werden, wird dann alles innerhalb von Axis behandelt.

Hat jemand eine Idee, bzw. wie kann ich anders als oben beschrieben aus dem Response (bzw. Abschitt Attachment Oktettstream) ein PDF generieren?

Ich habe hier keine Antworten mehr. Für etwaige Antworten danke ich euch schon einmal im Voraus.

04.03.2010 - 17:24 Uhr

Hallo Trekki1990,

naja, auf meinem Desktop befinden sich seit Jahren max. drei Icons ... trotzdem ist es nervig, die drei Icons immer nach einem Neustart, bzw. nach Userwechsel, wieder auf die ursprünglichen Positionn zu schieben. 😜

Das von Dir beschriebene Verhalten kenne ich auch, wenn ich eben nicht ordnungsgemäß runtergefahren habe, aber dies ist hier definitiv nicht der Fall.

03.03.2010 - 18:15 Uhr

Hallo "Kollegen",

kennt jemand vielleicht das total nervige Problem, dass immer nach einem Neustart oder Neuanmeldung die Icons auf dem Desktop linksbündig verschoben werden, obwohl Auto-Arange oder Line-To-Grid deaktiviert ist?

Weiß jemand, wo das gespeichert ist, da muss irgends was schief laufen und ist total nervig, weil man dann immer nach einem Neustart die Incons rumschieben muss 😜

Ich habe auf meinem Notebook zwei Profile, die die gleichen Einstellungen haben und bei einem verhält es sich eben nicht so wie erwartet 😜

Danke schon einmal für etwaige Antworten im Voraus.

03.03.2010 - 17:25 Uhr

Ja, ist ein einziger Response.

Zeit gestoppt einfach so ....


DateTime readStart = DateTime.Now;
readChars = stream.Read(buffer, 0, buffer.Length);
Console.WriteLine("Read 50000 bytes - took " + DateUtil.GetTimeSpanForNow(readStart));

03.03.2010 - 17:12 Uhr

OK, das bedeutet, wenn ich den Response abgeholt habe, dann ist lediglich der Request auf dem Server abgeschlossen? Die Antwort des Servers muss ich mir dann mittels des Auslesens des Streams holen. Würde ich das nicht machen, dann bleibt das ganze "Zeugs" noch auf dem Server rumliegen - eben bis zum eingestellten Timeout?

Wow, wenn das so ist, denn das habe ich nicht gewusst.

Hier noch mal ein paar Debugmeldungen. Es dauert oft 0 Millisekunden und dann wieder länger - Es liegt definitiv nicht an den Chunks, bzw. der Größe von diesen.

Start

Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00.2656284 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00.5781324 Read 50000 bytes - took 00:00:00.1406268 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00.3437544 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00.2343780 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00.0781260 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00.1875024 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00.1406268 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00.1875024 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00.1093764 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00.0156252 Read 50000 bytes - took 00:00:00.1718772 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00.0468756 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00.1250016 Read 50000 bytes - took 00:00:00.0781260 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00.0937512 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00.1718772 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00.1093764 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00.0156252 Read 50000 bytes - took 00:00:00.2343780 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00.2656284 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00.1562520 Read 50000 bytes - took 00:00:00.6718836 Read 50000 bytes - took 00:00:00.7187592 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00.2343780 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00.0781260 Read 50000 bytes - took 00:00:00.1718772 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00.1093764 Read 50000 bytes - took 00:00:00.0781260 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00.0781260 Read 50000 bytes - took 00:00:00.0156252 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00.0937512 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00.1406268 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00.0937512 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00.0937512 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00.1718772 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00.1093764 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00.1093764 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00.1718772 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00.1093764 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00.0781260 Read 50000 bytes - took 00:00:00.1093764 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00.0781260 Read 50000 bytes - took 00:00:00 Read 50000 bytes - took 00:00:00

Duration total 00:00:07.3125936

03.03.2010 - 16:36 Uhr

Leider habe ich die Contentlänge nicht, die steht immer, komischerweise, auf -1.
Das mit dem mehr Auslesen als vorhanden ist, kann ich nicht bestätigen, da es auch beim chunkweisen Auslesen immer wieder Wartezeiten gibt, also wenn weniger ausgelesen wird in der obigen Schleife.

Ich nehme einmal an, dass es die Leitung ist, denn heute sind mir erstmalig zwei Extremwerte aufgefallen.

Eine Zeit lang dauerte es lediglich 800 Millisekunden, dann auch schon mal 36 Sekunden - da macht definitiv jemand die Leitung dicht.

Ich gehe mal schwer davon aus, dass es programmiertechnisch richtig implementiert ist - den Rest sollen die selber auskasperln.

Ich danke euch für eure Hilfe.

P.S. Kann mir jemand sagen, wie das technisch nach dem Anfordern des Responses, mit GetResponse, weiterläuft? Wo befindet sich der Stream? Auf meinem Rechner oder irdendswo auf dem Server, mit dem man ins Netz geht? Komisch ist nämlich, dass nämlich das das Lesen öfters länger dauert als der Aufruf. Bin ich da noch irgendwie mit dem Endpoint "verdrahtet", also dass ich beim Lesen von dort noch was hole? Das sollte doch schon abgeschlossen sein, wenn ich den ResponseStream habe. Naja, eigentlich sollte es doch genauso schnell gehen, wie wenn ich aus einem File lese, was ja auch, siehe 800 Milllisekunden, manchmal geht.

03.03.2010 - 13:26 Uhr

@dr4gOn76,

das Problem scheint bekannt zu sein, jedoch habe ich hierfür keine Lösung gefunden.

Klick!

Hier wird vorgeschlagen, das Proxy-Objekt auf null zu setzen - ich kann jetzt nicht sagen, dass es schneller geht.

Der hängt bei mir von 3 - 8 Sekunden drinnen. (für 4 PDF-Dokumente + Soap-Envelope mit nur ca. 300 KB 😛)

Kann mich mal einer aufklären, wie das technisch abläuft? Ich dachte immer, nachdem ich den Response geholt habe, dass die Verbindung dann abgeschlossen ist und ich "nur noch" den Stream auslesen muss oder hängt das Auslesen des Streams noch irgendwie mit dem Endpoint zusammen?

Denn wie gesagt, ich habe hier eine langsame Leitung 2MB, aber der Aufruf ist es nicht, der solange dauert, sondern das Auslesen.

Auch der Vorschlag von kleines Eichhörnchen hat leider nichtst gebracht - trotzdem danke für den Vorschlag.

Mir fällt gerade auf, dass ich bei Sokets mit FTP das auch schon erlebt habe, dass das auslesen ewig dauert - kann ggf. an .NET liegen, denn mit z.B. FileZilla (C++-Programmierung) geht das ratz-fatz! - ist aber jetzt andere Baustelle.

01.03.2010 - 16:23 Uhr

könnte es sein ,das evtl im stream keine 50000 byte drinn sind und das er deswegen blockiert, da er noch nicht genug daten zum lesen hat?

Hallo JAck30lena,

nein, das habe ich gleich zu Beginn getestet - das fällt aus, denn er geht ein paar mal in den If-Zweig.

Gruß

01.03.2010 - 16:22 Uhr

Hallo MarsStein,

es handelt sich um einen Response-Stream von einem HttpWebResponse-Objekt.
Zuerst dachte ich, dass eben die Leitung zu langsam ist (was hier durchaus sein kann), jedoch dauert der Aufruf nicht so lange, sondern das lesen.

Ich denke, wenn die GetResponse abgeschlossen ist, dann ist das "Zeugs" im Stream auf dem Server, bzw. da wo eben das Programm läuft - und dann dauert eben das Lesen so lange.

Die Zeilen für den Aufruf ....


HttpWebResponse webResponse = null;

        try {
          webResponse = (HttpWebResponse)webRequest.GetResponse() ...


dauern nicht so lange, eben nur das Lesen aus dem Stream danach.

01.03.2010 - 16:01 Uhr

Hallo "Kollegen",

in dem Stream befinden sich "lediglich" 300 KB. Warum dauert das so lange?
Gibt es einen anderen, effizienteren Weg?

Hier der Quellcode:


private static byte[] ReadStream(Stream stream) {
      byte[] buffer = new byte[50000];
      byte[] streamContent = null;
      int readChars = int.MinValue;

      MemoryStream memoryStream = new MemoryStream();

      while(true) {
        DateTime starta = DateTime.Now;
        // !!! Hier dauert es ewig !!!
        readChars = stream.Read(buffer, 0, buffer.Length);
        // !!! End ewig !!!
        DateTime startb = DateTime.Now;

        if(readChars > 0) {
          memoryStream.Write(buffer, 0, readChars);
        }
        else {
          break;
        }
      }

      streamContent = memoryStream.ToArray();
      memoryStream.Close();
      stream.Close();

      return streamContent;
    }


Ich habe die Stelle gekennzeichnet - hier dauert es sehr lange (ca. 7 Sekunden). Ist das "normal" bei nur 300 KB?

Gruß und danke schon einmal für etwaige Antworten.

16.02.2010 - 12:28 Uhr

Leider geht es auch nicht mit der AppDomain, wie teilweise auch in den Artikeln beschrieben. Es scheint so zu sein, dass es nicht in (Unter) Threads geht, sondern nur im Hauptthread wird das Event gefeuert.

Leider ist auch im Interface IAsynchResult der Callback-Methode nichts zu finden - ich finde das nicht schön, dass ein Programmierer da nicht mehr rankommt, gerade dann, wenn man ein Framework baut und ein Consumer das nicht richtig anwendet.

Nun, dann muss ich halt drauf verzichten.

Trotzdem, danke für Deine Bemühungen!

16.02.2010 - 10:39 Uhr

Hallo iced-t89,

das geht aber imo nur in Windows-Forms-Anwendungen, bzw. in meinem Fall wird das Ereignis nicht gefeuert, wenn ich das ausprobiere. Bei meinem Beispiel, hätte ich wohl dazuschreiben sollen, handelt es sich um Consolen- und Windows-Service-Anwendungen.

Gruß

16.02.2010 - 10:07 Uhr

Hallo "Kollegen",

gibt es eine Möglichkeit vom Hauptthread aus, unbehandelte Exceptions die in sog. Unterthreads aus dem Threadpool erstellt wurden, zu handeln?

Zwar habe ich Events vereinbart, die genutzt werden können, bzw. sollten in diesem Fall. Was ist aber, wenn sich jemand nicht dran hält, das würde ja bedeuten, dass, wenn ein Aufruf alle Sekunde stattfindet, z.B. ein Timer ruft eine Methode immer wieder auf, einen ganzen Tag jede Sekunde eine Exception geworfen wird, was nicht gerade performant wäre. Ich würde gerne bei unbehandelten Exceptions den Thread gar nicht mehr aufrufen, sondern als aborted markieren. Geht das irgendwie, dass ich an die Exception rankomme?

Danke schon einmal für etwaige Antworten im Voraus.

29.01.2010 - 18:48 Uhr

OK, es gibt den Text-Tag, hier werden Formatierungen, z.B. Blanks übernommen und generiert, z.B. ...


<xsl:text>    public void Init() {&#xA;</xsl:text>
<xsl:text>      try {&#xA;</xsl:text>
<xsl:text>      }&#xA;</xsl:text>
<xsl:text>      catch(Exception ex) {&#xA;</xsl:text>
<xsl:text>        trow;&#xA;</xsl:text>
<xsl:text>      }&#xA;</xsl:text>
<xsl:text>    }&#xA;</xsl:text>

27.01.2010 - 11:42 Uhr

OK, danke, werde mal sehen, wie ich das hinbekomme.

27.01.2010 - 10:33 Uhr

Hallo Florian Reischl,

klar, das war nur ein Beispiel, da gehört natürlich text rein.

Meine Fragen bezogen sich auf den generierten Quellcode (hier C#-Datei).
Gibt es wirklich keine Methode hinterher, nachdem das File soz. auf der Platte liegt, eine Codeformatter drüberlaufen zu lassen?

Wenn ich zig Bedingungen und Schleifen in XSL programmiere, dann sieht das ja nicht sehr schön aus, wenn ich da schon acht geben muss, wie ich die Ausgaben zu formatieren habe.

27.01.2010 - 01:48 Uhr

verwendetes Datenbanksystem: XSL(T)

Hallo "Kollegen",

gibt es eine Möglichkeit, Ausgaben im XSLT-File zu formatieren?
Hier mal ein ganz kleines Beispiel:


<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="/">
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.XPath;
using System.Xml.Xsl;
using System.Xml;

namespace <xsl:value-of select="//class-info/namespace" /> {
  class <xsl:value-of select="//class-info/class-name" /> {
    static void Main(string[] args) {
      Console.Write("Hello World");
    }
  }
}
  </xsl:template>
</xsl:stylesheet>

Jetzt ist das ja noch übersichtlich. Was aber, wenn zig Schleifen und Abfragen dazukommen, dann habe ich doch ein "Kraut-und-Rüben-C#-File".

Kennt sich da jemand aus, wie man das machen kann oder vielleicht gibt es ja auch die Möglichkeit, nach dem Generieren mit einem Formatter (über das Programm wohlgemerkt und nicht über die IDE) den Code zu formatieren? Also, was man eigentlich im Hintergrund via IDE mit dem Befehl Edit.FormatDocument macht?

Danke schon einmal für etwaige Antworten im Voraus.

22.01.2010 - 10:19 Uhr

Danke erst mal für eure Antworten.

Gegenwärtig ist es so implementiert, dass die letzte ID inkrementiert wird und dann ein Update ausgeführt wird, so wie ashinger beschrieben.

Meine Frage lautet nun, wenn mehrere Threads gleichzeitig darauf zugreifen, ob es threadsafe ist, denn, bei z.B. zwei Threads können ja beide einen Select auf die Datenbank machen ohne das einer der beiden Threads schon beim Update war, also nach dem select wechselt der Thread und dann haben beide die aktuelle Zahl und bei beiden wird eins hochgezählt, was ja falsch ist, da dann beide die nächste Zahl haben.

Zumindest denke ich, dass es so ist. Wenn mir aber jemand sagt, dass man SPs synchronizieren kann (bzw. von Haus aus synchronisiert sind), dann wäre mir geholfen.

Ggf. müssten wir das dann auf autoincrement umstellen - damit sollten wir in der Tat keine Probleme haben.

22.01.2010 - 08:42 Uhr

verwendetes Datenbanksystem: SQL Server ≥ 2005

Hallo "Kollegen",

sind SPs threadsafe? Hintergrund ist, dass wir hier eine SP haben, die Sequences hochzählt, also IDs generiert, die gegenwärtig nur von einem Programm (also ein Thread) benutzt wird.

Ich wollte da jetzt mit Threads drübergehen und bin mir nicht sicher ob das gehen kann, denn ich gehe davon aus, dass verschiedene (intern im SQL-Server) Instanzen bei verschiedenen Zugriffen über Threads laufen - bin mir hier aber nicht sicher, deshalb die Frage hier.

Wie macht ihr das mit Sequences, wie es sie in Oracle gibt? Über Trigger?

Gruß und Danke schon einmal im Voraus für etwaige Antworten.

16.01.2010 - 19:21 Uhr

Ich möchte mal den Thread wieder öffnen, da ich aktuell das gleiche Problem habe. Ich würde gerne eine laufende Lösung mittels GPrint.exe mit einer API-Variante ersetzen.

Nun ist ja wieder eine Zeit lang vergangen - deshalb wollte ich hier mal nachfragen, ob es mittlerweile nicht andere Lösungen gibt?

Vielen Dank schon einmal im Voraus für eure Antworten

16.01.2010 - 14:50 Uhr

OK, ich habe es mit Fiddler hinbekommen - Thread gleich wieder closed.

16.01.2010 - 14:29 Uhr

Hallo,

ich suche nach einem Tool, indem ich SOAP-Messages (Response und Request) überwachen, bzw. überprüfen oder inspizieren möchte. Ich bin an den Inhalt interessiert, der auch wirklich übertragen wird (also SOAP-XML, Attachment-XML + Headers usw.).

Jetzt habe ich nach diversen Tools gesucht, mit denen ich das aber einfach nicht hinbekomme. Ich kann die einfach nicht konfigurieren.

Wichtig ist, dass ich die Aufrufe aus einer Anwendung machen möchte und nicht aus dem Tool heraus - das Tool soll mir nur die gewünschten Infos anzeigen, wenn eine Kommunikation stattfindet.

Ich habe einen WCF-Client und einen WCF-Server, beide auf verschiedenen Rechnern und die Kommunikation klappt wunderbar. Konfiguriert ist der Standard httpBasic.

Wie ist das jetzt technisch? Ich dachte immer, dass der Client über den Webport (also 80) an den Server sendet. Auf dem Server wird zum Zielport (hier 8000) geleitet, die einkommende Message wird auf die Objekte reflektiert und dann sendet generiert der Server einen Soap-Response-Message und sendet die widerum über den Webport (80). Ist das nicht so?

Weiß jemand, wie ich schnell an die Infos komme? Ggf. auch über APIs, die ggf. schon in WCF mit drinnen sind - ich stecke da leider nicht so tief drinnen.

Vielen Dank schon einmal für etwaige Antworten im voraus.

14.01.2010 - 22:26 Uhr

@chillimix,

genau das wollte ich ja machen und hatte es nicht hinbekommen.
Nun bin ich aber erst mal soweit, dass es mit einem WCF-Host klappt.

Für alle, die es interessiert, der Quellcode sieht so aus:


WebClient webClient = new WebClient();
String soap = File.ReadAllText(@"C:/soap-request.xml");
webClient.Headers.Add("Content-Type", "text/xml;charset=utf-8");
webClient.Headers.Add("SOAPAction", "http://tempuri.org/IContractor/SayHello");
String response = webClient.UploadString("http://localhost:8000/WCFTest", soap);

Also, bin ein bißchen weiter und habe heute auch noch gesehen, dass bei dem AXIS-SOAP-Service auch noch Attachments drinnen sind. Naja, ich hoffe, dass ich das irgendswie hinbekomme.

Hier noch das manuell erstellte Request-Envelope:


<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
   <soapenv:Header/>
   <soapenv:Body>
      <tem:SayHello>
         <tem:name>franconian_dude</tem:name>
      </tem:SayHello>
   </soapenv:Body>
</soapenv:Envelope>

Und das vom WCF-Host generierte Response-Envelope:


<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header><ActivityId CorrelationId="7ab76409-1bb2-4431-bb89-fc7fbfafe639" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">17e7a2d8-3562-4b6d-b22b-c58b7c30301a</ActivityId></s:Header>
    <s:Body>
      <SayHelloResponse xmlns="http://tempuri.org/"><SayHelloResult>Hello my friend, franconian_dude</SayHelloResult>
      </SayHelloResponse>
    </s:Body>
</s:Envelope>