Hi,
I have a .NET WCF Client and Apache Axis2 Web Service. My client makes a custom binding enforcing HTTP Transport and UTF-8 encoding, this because Axis2 and Java World understands by default only UTF-8 encoded character sets. And well, recently I have run into a problem, that my VB/C# .NET WCF client has to send words (all in a SOAP/XML structure) to the server consisting of German Umlauts 'ä' 'ö' 'ü', which resulted in a crash somewhere in a web service routine. But again: my custom binding said truly to use UTF-8. Now I ask you: why does it sent a bad non UTF-8, a bad 8 bit character to the wire that my service crashes. Simple answer: because this custom binding with UTF-8 encoding forced does not work at all as it should. Also - I can prove it - because I have special behavior implemented as INTERCEPTORS for each outgoing and incoming message, client and server side. I reported it to Microsoft in one of this WCF Web Service .Net forums. Unfortunately nothing but warm air comes back. Then I decided to help myself. As I was unable to look deep into the code doing wrong (deep in some .NET assemblies), I wrote a routine to substitute all .NET characters to a UTF-8 encoding before I send the request to the stub. Since - my problem is gone. And off course - at my legacy server I have to turn UTF-8 double byte encoded chars like German Umlauts into DEC MULTINATIONAL CHARACTER SET a 8 bit char set on input to legacy server as well before transfer back via AXIS2 to the wire. But that was already done before and for that I used some LIBXML routines IsoLatin2UTF8() and UTF82IsoLatin() written in ANSI C. Maybe if you enforce your .NET chars belonging to ISO Latin you can use this two routines too. The interesting thing is, that with my current binding, all UTF-8 encoded characters arriving as response from the AXIS2 Server are perfectly converted into what .NET WCF client and the VB.NET client needs to display them correct. So the problem I was faced with is on sending to the server. Maybe this helps you a bit. Josef.Stadelmann @axa-winterthur.ch Von: Oleg Kozlov [mailto:oleg.koz...@leadpoint.com] Gesendet: Montag, 22. Februar 2010 21:50 An: java-user@axis.apache.org Betreff: illegal XML character 0x8 from a .Net SOAP service :( Hello, I have an Axis2 1.5.1 (Java) client, auto-generated by wsdl2java with XmlBeans framework. I'm integrating with a new vendor that has a SOAP web service written in .Net. The service is basically a wrapper around a legacy telephony switch. The service returns 1-9 binary numbers in its response in one of the XML elements. I have to point out that I our (client) side we do not even need to use that element at all, it just has some meaningless data... Apparently our vendor's other clients are all using .Net and the .Net framework does not care about inserting or parsing illegal characters in the SOAP Body ... So, I'm getting an exception (see below). I tried solving this problem by writing a custom Axis2 client module where I get access to the XML element that contains illegal characters and either set it's text value to blank string, or detach and get rid of the whole XML element altogether (since I don't need it). However, every time I iterate to the bad XML element - the parser blows up with the parsing error again inside my custom module. Also, due to the fact that Axis is using pull parsing method - there is no way to jump over the element with binary data, so I was not able to copy the entire XML DOM into a new DOM document skipping over the bad element. I could not find a way to get low level access to XML stream where I could, for example, read from an input stream and write to an output stream, and skip over the illegal character. Can anyone recommend another solution? ============================== org.apache.axis2.AxisFault: [com.ctc.wstx.exc.WstxLazyException] Illegal character entity: expansion character (code 0x8) not a valid XML character at [row,col {unknown-source}]: [1,13020] at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430) at leadpoint.voice.service.paetec.callrecords.client.ServiceStub.fromOM(ServiceStub.java:3315) at leadpoint.voice.service.paetec.callrecords.client.ServiceStub.getEnhancedCDR(ServiceStub.java:1063) at leadpoint.voice.service.paetec.callrecords.client.ServiceTest.testgetEnhancedCDR(ServiceTest.java:184) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at com.intellij.junit3.JUnit3IdeaTestRunner.doRun(JUnit3IdeaTestRunner.java:108) at com.intellij.junit3.JUnit3IdeaTestRunner.startRunnerWithArgs(JUnit3IdeaTestRunner.java:42) at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:165) at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:60) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:110) Caused by: [com.ctc.wstx.exc.WstxLazyException] com.ctc.wstx.exc.WstxParsingException: Illegal character entity: expansion character (code 0x8) not a valid XML character at [row,col {unknown-source}]: [1,13020] at com.ctc.wstx.exc.WstxLazyException.throwLazily(WstxLazyException.java:45) at com.ctc.wstx.sr.StreamScanner.throwLazyError(StreamScanner.java:704) at com.ctc.wstx.sr.BasicStreamReader.safeFinishToken(BasicStreamReader.java:3657) at com.ctc.wstx.sr.BasicStreamReader.getTextCharacters(BasicStreamReader.java:830) at javax.xml.stream.util.StreamReaderDelegate.getTextCharacters(StreamReaderDelegate.java:158) at org.apache.axiom.om.impl.builder.SafeXMLStreamReader.getTextCharacters(SafeXMLStreamReader.java:113) at org.apache.axiom.om.impl.llom.OMStAXWrapper.getTextCharacters(OMStAXWrapper.java:418) at org.apache.axiom.om.util.OMXMLStreamReaderValidator.getTextCharacters(OMXMLStreamReaderValidator.java:239) at org.apache.xmlbeans.impl.store.Locale.loadXMLStreamReader(Locale.java:1154) at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:843) at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:826) at org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.parse(SchemaTypeLoaderBase.java:231) at com.paetec.e800ws.xmlservices.GetEnhancedCDRResponseDocument$Factory.parse(GetEnhancedCDRResponseDocument.java:165) at leadpoint.voice.service.paetec.callrecords.client.ServiceStub.fromOM(ServiceStub.java:3226) ... 23 more Caused by: com.ctc.wstx.exc.WstxParsingException: Illegal character entity: expansion character (code 0x8) not a valid XML character at [row,col {unknown-source}]: [1,13020] at com.ctc.wstx.sr.StreamScanner.constructWfcException(StreamScanner.java:605) at com.ctc.wstx.sr.StreamScanner.throwParseError(StreamScanner.java:461) at com.ctc.wstx.sr.StreamScanner.reportIllegalChar(StreamScanner.java:2375) at com.ctc.wstx.sr.StreamScanner.checkAndExpandChar(StreamScanner.java:2321) at com.ctc.wstx.sr.StreamScanner.resolveSimpleEntity(StreamScanner.java:1180) at com.ctc.wstx.sr.BasicStreamReader.readTextSecondary(BasicStreamReader.java:4675) at com.ctc.wstx.sr.BasicStreamReader.readCoalescedText(BasicStreamReader.java:4124) at com.ctc.wstx.sr.BasicStreamReader.finishToken(BasicStreamReader.java:3699) at com.ctc.wstx.sr.BasicStreamReader.safeFinishToken(BasicStreamReader.java:3647) ... 34 more ============================== Thank you, Oleg.