AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Fehlermeldung beim Zugriff auf C#-WCFService mit D2006
Thema durchsuchen
Ansicht
Themen-Optionen

Fehlermeldung beim Zugriff auf C#-WCFService mit D2006

Ein Thema von Zottel · begonnen am 8. Nov 2008 · letzter Beitrag vom 10. Nov 2008
Antwort Antwort
Seite 1 von 2  1 2      
Zottel
(Gast)

n/a Beiträge
 
#1

Fehlermeldung beim Zugriff auf C#-WCFService mit D2006

  Alt 8. Nov 2008, 16:12
Hi ihr,

ich soll einen WCF Service in C# schreiben und darauf dann mit einem Delphi-Client zugreifen.

Der C#-Service ist nicht das Problem.... Der Delphi-Client unter W32 macht derzeit nur Zicken....

1) Hat da schon jemand Erfahrungen gesammelt?
2) Geht ausser basicHTTPBinding noch etwas anderes?
3) Soll ich die XML-Kommunikation lieber selber schreiben, oder gibts da Delphi-komponenten für, wie z.b. IndySoap?

Bisher sind meine Versuche eher kläglich verlaufen, weil der HTTPSoapClient unter Delphi keine Verbindung zum Server aufbauen wollte.
Abstruse Fehlermeldungen machen mir das leben etwas schwer.

Wie habt Ihr das gelöst, wenn falls ihr schonmal vor solch einem Problem gestanden habt?

vielen Dank schonmal
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Mit W32 Delphi auf C# WCF zugreifen? Erfahrungen?

  Alt 8. Nov 2008, 18:19
Hi,

welche Delphi Version steht Dir denn zur Verfügung? Eigentlich geht das mit den Bordmitteln von Delphi (ab Version 7 glaub ich) ganz gut.

Ich selber habe mir allerdings eigene Verfahren auf Basis von Synapse erstellt, da ich mit Delphi 5 gearbeitet hab.
Wenn dich das interessiert, melde dich. Ansonsten beschreib mal dein Problem etwas genauer

- gibt es Fehlermeldungen ?
- hast Du schon mal tcpTrace dazwischen gehängt um zu sehen, wo es hapert ?

Gruss

[edit] Merke grad, mit WCF haben sowohl die Delphi Bordmittel als auch mein Ding nix zu tun, sondern das eignet sich grad mal für einfache WebServices. [/edit]
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  Mit Zitat antworten Zitat
Zottel
(Gast)

n/a Beiträge
 
#3

Re: Mit W32 Delphi auf C# WCF zugreifen? Erfahrungen?

  Alt 8. Nov 2008, 23:48
Ich habe Delphi 7 und Delphi 2006 zur Verfügung, wobei die Lösung mit beiden Systemen umsetzbar sein muss.

Ich bau nochmal einen TestClient und poste dann die Fehlermeldungen samt den SourceSchnipseln.....
Die Bordmittel waren auch mein erster Griff.. aus der WDSL datei einfach ne Unit erzeugt und los gehts... naja.. so war der Gedanke.
Scheinbar macht WCF aber ein paar unterschiede. Ich schliesse aber derzeit einen Fehler meinerseits nicht aus und werde heute nachmittag nochmal testen.

Danke trotzdem
  Mit Zitat antworten Zitat
Zottel
(Gast)

n/a Beiträge
 
#4

Re: Mit W32 Delphi auf C# WCF zugreifen? Erfahrungen?

  Alt 9. Nov 2008, 11:47
So. Nun habe ich das ganze Projekt nochmal aufgesetzt und diesmal so, das ich vernünftige Fehlermeldungen bekomme.

Der C# WCF-Service hat einen Server und einen Client, die einwandfrei zusammenarbeiten. Den Protokollverkehr habe ich rausgesucht:

Delphi-Quellcode:
POST /WCFMaster/ HTTP/1.1
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://tempuri.org/IJNDemoService/echoString"
Host: 192.168.100.110:1973
Content-Length: 172
Expect: 100-continue

HTTP/1.1 100 Continue

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
 <s:Body>
  <echoString xmlns="http://tempuri.org/">
   <Value>TestString</Value>
  </echoString>
 </s:Body>
</s:Envelope>

HTTP/1.1 200 OK
Content-Length: 210
Content-Type: text/xml; charset=utf-8
Server: Microsoft-HTTPAPI/1.0
Date: Sun, 09 Nov 2008 10:44:23 GMT

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
 <s:Body>
  <echoStringResponse xmlns="http://tempuri.org/">
   <echoStringResult>TestString</echoStringResult>
  </echoStringResponse>
 </s:Body>
</s:Envelope>
Dieser Ausschnitt beinhaltet die Clientanfrage und die Serverantwort.

Wenn ich nun einen Delphi-Client mit D2006 aufsetze und mit eine Unit, zum zugreifen auf den WCF-Service, mit dem WSDL-Import erzeugen lasse,
Dann scheint er zumindest bei mit dem WCF-Service anzufrage. Aber der versteht nur bahnhof und gibt entsprechende Fehlermeldung raus:
Zitat:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt WCFSniffer.exe ist eine Exception der Klasse ERemotableException mit der Meldung 'Error in deserializing body of request message for operation 'echoString'. OperationFormatter encountered an invalid Message body. Expected to find node type 'Element' with name 'echoString' and namespace 'http://tempuri.org/'. Found node type 'Element' with name 'parameters' and namespace ''' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------
Den Transportverkehr habe ich auch rausgesucht:
Delphi-Quellcode:
POST /WCFMaster/ HTTP/1.1
SOAPAction: "http://tempuri.org/IJNDemoService/echoString"
Content-Type: text/xml
User-Agent: Borland SOAP 1.2
Host: 192.168.100.110:1973
Content-Length: 379
Connection: Keep-Alive
Cache-Control: no-cache

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
  <SOAP-ENV:Body>
    <parameters xsi:type="xsd:string">test</parameters>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

HTTP/1.1 500 Internal Server Error
Content-Length: 2371
Content-Type: text/xml; charset=utf-8
Server: Microsoft-HTTPAPI/1.0
Date: Sun, 09 Nov 2008 11:24:44 GMT

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
 <s:Body>
  <s:Fault>
   <faultcode xmlns:a="http://schemas.microsoft.com/net/2005/12/windowscommunicationfoundation/dispatcher">a:InternalServiceFault</faultcode>
   <faultstring xml:lang="de-DE">Error in deserializing body of request message for operation 'echoString'. OperationFormatter encountered an invalid Message body. Expected to find node type 'Elementwith name 'echoStringand namespace 'http://tempuri.org/'. Found node type 'Elementwith name 'parametersand namespace ''</faultstring>
   <detail>
    <ExceptionDetail xmlns="http://schemas.datacontract.org/2004/07/System.ServiceModel" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
     <HelpLink i:nil="true"/>
     <InnerException>
      <HelpLink i:nil="true"/>
      <InnerException i:nil="true"/>
      <Message>OperationFormatter encountered an invalid Message body. Expected to find node type 'Elementwith name 'echoStringand namespace 'http://tempuri.org/'. Found node type 'Elementwith name 'parametersand namespace ''</Message>
      <StackTrace> at System.ServiceModel.Dispatcher.PrimitiveOperationFormatter.DeserializeRequest(XmlDictionaryReader reader, Object[] parameters)&#xD;
         at System.ServiceModel.Dispatcher.PrimitiveOperationFormatter.DeserializeRequest(Message message, Object[] parameters)</StackTrace>
      <Type>System.Runtime.Serialization.SerializationException</Type>
     </InnerException>
     <Message>Error in deserializing body of request message for operation 'echoString'. OperationFormatter encountered an invalid Message body. Expected to find node type 'Elementwith name 'echoStringand namespace 'http://tempuri.org/'. Found node type 'Elementwith name 'parametersand namespace ''</Message>
     <StackTrace> at System.ServiceModel.Dispatcher.PrimitiveOperationFormatter.DeserializeRequest(Message message, Object[] parameters)&#xD;
        at System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs(MessageRpc&amp; rpc)&#xD;
        at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&amp; rpc)&#xD;
        at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&amp; rpc)&#xD;
        at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)</StackTrace>
     <Type>System.ServiceModel.CommunicationException</Type>
   </ExceptionDetail>
  </detail>
  </s:Fault>
 </s:Body>
</s:Envelope>
Scheint so, als verstünde C# die Delphi-Anforderung nicht. Oder habe ich etwas verkehrt gemacht?
Angeblich soll WCF ja einen normalen SOAP-Dienst darstellen können.

Eine andere Alternative wäre auch noch, das ich das ganze per Hand Parse und die anfragen und Antworten selbst auseinanderpflücke. Aber das möchte ich mir gerne ersparen.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#5

Re: Fehlermeldung beim Zugriff auf C#-WCFService mit D2006

  Alt 9. Nov 2008, 15:14
Zitat von Zottel:
Wie habt Ihr das gelöst, wenn falls ihr schonmal vor solch einem Problem gestanden habt?
Das WSDL Importer und SOAP Runtime Update (erhältlich auf CodeGear CodeCentral) ist installiert?
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Zottel
(Gast)

n/a Beiträge
 
#6

Re: Fehlermeldung beim Zugriff auf C#-WCFService mit D2006

  Alt 9. Nov 2008, 18:15
moinmoin,

das Update kannte ich noch nicht. Hat aber leider kein Einfluss auf das Ergebnis. Die XML-Struktur wird vom WCF weiterhin niicht verstanden.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#7

Re: Fehlermeldung beim Zugriff auf C#-WCFService mit D2006

  Alt 9. Nov 2008, 19:29
Zitat von Zottel:
moinmoin,

das Update kannte ich noch nicht. Hat aber leider kein Einfluss auf das Ergebnis. Die XML-Struktur wird vom WCF weiterhin niicht verstanden.
Ok, dann wäre der nächste Schritt den SOAP Request abzufangen und mit dem Sollzustand zu vergleichen. Dazu kann das OnBeforeExecute Event der THTTPRio Komponente verwendet werden. Wie die korrekte SOAP Nachricht aussehen muss, sollte bekannt sein (sonst wird die Fehlersuche schwierig).

Hier sind zwei Variationen eines OnBeforeExecute Event Handlers, für Delphi 2007 und 2009:

Delphi-Quellcode:
{$IF RtlVersion < 20}
procedure TMyClass.MyBeforeExecute(const MethodName: string; var SOAPRequest: WideString);
begin
  WriteLn(SOAPRequest);
   with TStringlist.Create do
   try
     Text := SOAPRequest;
     SaveToFile('soaprequest_d2007.txt');
   finally
     Free;
   end;
end;
{$ELSE}
procedure TMyClass.MyBeforeExecute(const MethodName: string; SOAPRequest: TStream);
var
  S: TStringStream;
begin
  S := TStringStream.Create;
  try
   S.LoadFromStream(SOAPRequest);
   WriteLn(S.DataString);
   with TStringlist.Create do
   try
     Text := S.DataString;
     SaveToFile('soaprequest_d2009.txt');
   finally
     Free;
   end;
  finally
    S.Free;
  end;
end;
{$IFEND}
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Zottel
(Gast)

n/a Beiträge
 
#8

Re: Fehlermeldung beim Zugriff auf C#-WCFService mit D2006

  Alt 9. Nov 2008, 19:56
Das hatte ich schon gemacht. Siehe oben.
Aber damit ich nichts falsches sage, habe ich es nochmal mit der Routine versucht und dabei folgendes bekommen:
Delphi-Quellcode:
<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
  <SOAP-ENV:Body>
    <parameters xsi:type="xsd:string">test</parameters>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Also ein vollkommen anderer Request, als benötigt...
WCF wartet auf:
Delphi-Quellcode:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
  <echoString xmlns="http://tempuri.org/">
   <Value>TestString</Value>
  </echoString>
</s:Body>
</s:Envelope>
Nu bin ich grad am rumbstaeln mit Dem SoapRPCService Attribute.
Aber irgendwie hat das auch nicht hin.... *gummel*

Aber trotzdem danke
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#9

Re: Fehlermeldung beim Zugriff auf C#-WCFService mit D2006

  Alt 10. Nov 2008, 06:38
Es sieht nach einem einfachen Webservice aus, unter embarcadero.public.delphi.webservices könntest Du das Problem beschreiben und die WSDL posten, dort wird meistens rasch geholfen.
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Zottel
(Gast)

n/a Beiträge
 
#10

Re: Fehlermeldung beim Zugriff auf C#-WCFService mit D2006

  Alt 10. Nov 2008, 18:56
Hab zumindest einen Fehler gefunden...
ich mußte die Unit, die von Delphi erstellt wird umändern und
InvRegistry.RegisterInvokeOptions(TypeInfo(IJNDemoService), [ioDocument,ioLiteral]); hinzufügen.

Dann bekomm ich zumindest eine andere Fehlermeldung. Aber WCF versteht jetzt wenigstens das XML von Delphi....


falls einer mit
Delphi-Quellcode:
Im Projekt WCFSniffer.exe ist eine Exception der Klasse ERemotableException mit der Meldung
'The message with Action 'http://tempuri.org/#echoByte' cannot be processed at the receiver,
due to a ContractFilter mismatch at the EndpointDispatcher.
This may be because of either a contract mismatch (mismatched Actions between sender and receiver)
or a binding/security mismatch between the sender and the receiver.
Check that sender and receiver have the same contract and the same binding
(including security requirements, e.g. Message, Transport, None).' aufgetreten.
etwas anfangen kann, so melde er sich bei mir
Das "http://tempuri.org/#echoByte" gefällt mir nicht... irgendwie muss Delphi das etwas anders machen, als erwartet...

naja... trotzdem erstmal danke. Rest suche ich in der Borland Newsgroup zusammen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz