Net Sprache

Deutschsprachiges X#-Forum – German language forum

Moderator: wriedmann

Post Reply
User avatar
Horst
Posts: 337
Joined: Tue Oct 13, 2015 3:27 pm

Net Sprache

Post by Horst »

Hallo
Dank Wolfgangs Beispiel cHttpBasic konnte ich einige meiner Fehler beheben.

Da viel mir was auf
Das wird kompiliert

Code: Select all

	
LOCAL ohttpRequest	AS System.Net.HttpWebRequest
ohttpRequest	:= ( System.Net.HttpWebRequest ) System.Net.HttpWebRequest:Create("https://api.bexio.com/2.0/contact")
und das nicht

Code: Select all

	
LOCAL ohttpRequest	AS System.Net.HttpWebRequest
ohttpRequest	:= System.Net.HttpWebRequest:Create("https://api.bexio.com/2.0/contact")
Da frage ich mich warum.

Gruss Horst
User avatar
wriedmann
Posts: 3784
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Net Sprache

Post by wriedmann »

Hallo Horst,
der Unterschied zwischen den beiden Versionen ist ein sogenannter Cast.
Der sagt dem Compiler, daß

Code: Select all

System.Net.HttpWebRequest:Create("https://api.bexio.com/2.0/contact")
ein Objekt vom Typ

Code: Select all

System.Net.HttpWebRequest
zurückliefert.
Typisiert ist diese Methode nämlich als

Code: Select all

System.Net.WebRequest
und in der Doku steht drin:
"A WebRequest descendant for the specific URI scheme."
Der genaue Typ der Rückgabe hängt also von der URL ab.
Wenn man das ganz sauber programmieren wollte, und eventuelle Fehler abfangen, dann könnte man das sogar so schreiben:

Code: Select all

local oTemp as System.Net.WebRequest
oTemp := System.Net.HttpWebRequest:Create("https://api.bexio.com/2.0/contact")
if oTemp is System.Net.HttpWebRequest
  ohttpRequest := ( System.Net.HttpWebRequest ) oTemp
else
  // Fehlerbehandlung
endif
Wolfgang
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
User avatar
robert
Posts: 4567
Joined: Fri Aug 21, 2015 10:57 am
Location: Netherlands

Net Sprache

Post by robert »

Wolfgang,
wriedmann post=23883 userid=336 wrote:Hallo Horst,
Wenn man das ganz sauber programmieren wollte, und eventuelle Fehler abfangen, dann könnte man das sogar so schreiben:

Code: Select all

local oTemp as System.Net.WebRequest
oTemp := System.Net.HttpWebRequest:Create("https://api.bexio.com/2.0/contact")
if oTemp is System.Net.HttpWebRequest
  ohttpRequest := ( System.Net.HttpWebRequest ) oTemp
else
  // Fehlerbehandlung
endif
I would code it like this

Code: Select all

if oTemp is System.Net.HttpWebRequest VAR ohttpRequest 
  // do your thing
else
  // Fehlerbehandlung
endif
The advantages:
- there is no need for a separate declaration of ohttpRequest
- the scope (life time ) of the variable is that of the IF statement

Robert
XSharp Development Team
The Netherlands
robert@xsharp.eu
User avatar
wriedmann
Posts: 3784
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Net Sprache

Post by wriedmann »

Hi Robert,
thank you very much for your comment.
Personally I prefer to not use the "var" statement, but to define a variable explicetely in the header of the method, first to keep my code more readable (many years to come), and second to help XIDE with Intellisense.
But that is a pure personal choice and I'm pretty sure many other programmers would not agree with me on this.
Wolfgang
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
User avatar
Horst
Posts: 337
Joined: Tue Oct 13, 2015 3:27 pm

Net Sprache

Post by Horst »

Hallo

Das heisst der Compiler versucht links und rechts der Zuweisung den gleichen Datentyp zu erhalten.
Er weiss also, dass ohttpRequest ein Objekt ist vom Typ System.Net.HttpWebRequest weil ich es im LOCAL definiert habe.

Laut Hilfe gibt Create() einen WebRequest zurück , hmmm ein WebRequest ist kein HttpWebRequest darum muss man tricksen und ( System.Net.HttpWebRequest ) vorne ran schreiben . Richtig ?

httpWebRequest erbt von WebRequest, da verhält sich .Net anders als VO oder ? VO würde da nicht reklamieren.

Noch eine Frage. Wen ich den API Request von einer http Seite auf eine https Seite mache geht das ? Ich bekomme da die Fehlermeldung:
Es konnte kein geschützter SSL/TLS-Kanal erstellt werden..

Gruss
Horst
User avatar
wriedmann
Posts: 3784
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Net Sprache

Post by wriedmann »

Hallo Horst,
nicht ganz: Du könntest einen Objekt, das als WebRequest definiert ist, ohne weiteres ein Objekt der Klasse HttpWebRequest zuweisen, aber nicht umgekehrt.
Das geht in VO aber auch nicht, wenn die Methode/Funktion streng typisiert ist und der Rückgabewert nicht vom Typ "object" ist.
Das mit dem Casten sagt dem Compiler nur: hör mal, das, was hier der Rückgabewert ist, ist ein Objekt der Klasse HttpWebRequest.
Damit ist der Compiler zufrieden.
Wenn zur Laufzeit das Objekt aber nicht den Typ hat, auf den gecastet wird, sondern einen inkompatiblen Typ, bekommst Du einen Laufzeitfehler.
Was die Fehlermeldung betrifft: Wie Deine Seite aufgerufen wird, ist vollkommen gleichgültig - es ist Dein Prozeß, der die Verbindung aufbaut. Und wenn das Zertifikat der aufgerufenen Seite korrekt ist, sollte das funktionieren - außer die aufgerufene Seite verlangt mindestens TLS 1.2.
Dann musst Du vor dem ersten Aufruf TLS 1.2 einschalten:

Code: Select all

System.Net.ServicePointManager.SecurityProtocol := System.Net.SecurityProtocolType.Tls12
Wolfgang
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
User avatar
Horst
Posts: 337
Joined: Tue Oct 13, 2015 3:27 pm

Net Sprache

Post by Horst »

Hallo Wolfgang

Ich könnte dich knuddeln.

Code: Select all

System.Net.ServicePointManager.SecurityProtocol := System.Net.SecurityProtocolType.Tls12
und es funktionierte

Danke
Horst
Post Reply