Avatar billede anders_cp Nybegynder
16. oktober 2009 - 18:04 Der er 17 kommentarer og
1 løsning

.NET consumer til java-webservice

Hej
Jeg ved godt at webservices kører efter internationale standarder, men jeg kan simpelthen ikke koble på Apple's java webservice. Deres "hjælp" er her:
http://gsx.info.apple.com/integration/WSFAQs.htm

Jeg skal - som jeg ser det - kort fortalt autoriseres med navn og brugernavn samt et certifikat:

http://gsx.info.apple.com/integration/WSReference/APIs/Authenticate.htm


"
How do I securely connect to the GSX Web Services Servers?
GSX Web Services Server is configured to run and accept responses over HTTPS. To be able to talk to the GSX Web Services server, your application must make HTTPS requests over the Internet, not http.

To connect to the GSX test server, use the attached CA Certificate (ist-cacert.der.zip). Download the file and unzip it. If you are working with a java client, add the following command to your client:

System.setProperty("javax.net.ssl.trustStore","Path To istcacert");

This command will instruct java to use istcacert for verifying SSL Certificates. The istcacert file can only be used for the sites that use the SSL certificate provided by Apple.

For non-java clients, use a similar command. This is not required for the GSX production server.
"

Med deres WDSL-fil har jeg nemt lavet en web-reference i .NET, og kan lave alle mulige instanser, men kan ikke bruge dem til noget. Jeg tror, og ønsker hjælp til, at kunne "logge ind" på deres webservice.

Her er hvad jeg har lavet:
applewebref.Address a = new WebApplication1.applewebref.Address();
a.Adressline1, a.Adressline2, a.firstname, a.lastname etc.
Avatar billede arne_v Ekspert
16. oktober 2009 - 18:30 #1
For en quick and dirty saa proev:

ServicePointManager.CertificatePolicy = new MySecurityPolicy();

inden den kode hvor:

internal class MySecurityPolicy : ICertificatePolicy
{
    public bool CheckValidationResult(ServicePoint sPoint, X509Certificate cert, WebRequest wRequest, int certProb)
    {
        return true;
    }
}
Avatar billede anders_cp Nybegynder
16. oktober 2009 - 19:12 #2
Hej
Mange tak for dit svar. Jeg håber virkelig du kan hjælpe mig i mål.

Jeg kan se af det kode du har givet mig at det er en måde at få auth-kode ind. Men du bliver nødt til at skære det ud i pap for mig, for jeg skulle gerne ende med at hente og bringe data fra Apple.

Her er hvad apple skriver jeg skal logge ind med; username, password, accountNo og cerficeringen.
http://gsx.info.apple.com/integration/WSReference/APIs/Authenticate.htm


I deres javakode-demo-eksempel (som fylder over 1000 linjer kode) kan jeg bl.a. se

import com.apple.gsx.sampleclient.GSXWSSampleAPIConsumer;

public class GSXWSAPIDemo {
    public static void main(String[] args) throws Exception {
       
        GSXWSSampleAPIConsumer thisRun = new GSXWSSampleAPIConsumer();
       
        thisRun.initialize();
        thisRun.getWarrantyStatus("RM219000KSL");
       
    }
   
}

altså skal jeg kunne hente data fra webservicen, bl.a. ved at indtaste et serienummer.




Her er således min kode. Den er kort, så jeg håber du kan hjælpe mig videre frem:
        protected void TestWebRef_Click(object sender, EventArgs e)
        {
            ServicePointManager.CertificatePolicy = new MySecurityPolicy();

            // webreference url = https://gsxit.apple.com/gsxws.wsdl
            applewebref.Address a = new WebApplication1.applewebref.Address();
            string firstname = a.firstName;
        }

        internal class MySecurityPolicy : ICertificatePolicy
        {
            public bool CheckValidationResult(ServicePoint sPoint, X509Certificate cert, WebRequest wRequest, int certProb)
            {
                string certificatefile = "ist-cacert.der";

                // Load the certificate into an X509Certificate object.
                cert = new X509Certificate(certificatefile);

                return true;
            }
        }
Avatar billede arne_v Ekspert
17. oktober 2009 - 04:18 #3
Virker det hvis metoden bare indeholder:

return true;

?

Hvis ja, så har vi et udgangspunkt og kan gå igang med faktisk at validere.
Avatar billede anders_cp Nybegynder
17. oktober 2009 - 10:35 #4
Ja, den kompilerer og kører fint.
Avatar billede anders_cp Nybegynder
17. oktober 2009 - 13:16 #5
altså din funktion med true kører fint. Jeg mangler stadig at få løst forbindelsen til apple-webserver
Avatar billede anders_cp Nybegynder
21. oktober 2009 - 12:34 #6
Har du opgivet projektet?
Avatar billede arne_v Ekspert
25. oktober 2009 - 23:19 #7
Jeg kom lidt væk fra det.

Har du prøvet:

public bool CheckValidationResult(ServicePoint sPoint, X509Certificate cert, WebRequest wRequest, int certProb)
{
    X509certificate goodcert = new X509Certificate("ist-cacert.der");
    return cert == goodcert;
}

?
Avatar billede anders_cp Nybegynder
13. november 2009 - 15:27 #8
Så er det dejligt du er kommet tilbage :-)

Jeg har også selv været lidt væk, men det er stadig brandaktuelt.


Jeg har i mellemtiden modtaget to filer fra Apple, som måske skal med i kaldet. De hedder:
Authenticate Request.xml
og
Authenticate Response.xml

De er ikke så store så jeg har kopiret dem ind i næste meddelelse her på Eksperten.



Jeg ved ikke hvordan jeg kalder din funktion. Jeg har ikke styr på hvad:

ServicePoint, WebRequest og certProb er.


Her er hvad jeg har skrevet af kode:
internal class MySecurityPolicy : ICertificatePolicy
        {

            public bool CheckValidationResult(ServicePoint sPoint, X509Certificate cert, WebRequest wRequest, int certProb)
            {
                // Load the certificate into an X509Certificate object.
                X509Certificate goodcert = new X509Certificate("ist-cacert.der");
                return cert == goodcert;
            }
        }


Så har jeg forsøgt mig med kun at kalde cerfikatet:
public void testcert()
        {
            X509Certificate goodcert = new X509Certificate(@"C:\Documents and Settings\hartig\Skrivebord\GSX\WebApplication1\WebApplication1\ist-cacert.der");
            // Get the value
            Page.Response.Write(goodcert.ToString(true));
           
            Page.Response.Write("<br /><br />"+goodcert.ToString(false));
        }

Jeg får flg. output, som jeg ikke ved om kan bruges til noget:

[Subject] E=certificates@group.apple.com, CN=IS&T Root Cert, OU=IS&T Enterprise Technology Services, O=Apple Computer, L=Cupertino, S=California, C=US [Issuer] E=certificates@group.apple.com, CN=IS&T Root Cert, OU=IS&T Enterprise Technology Services, O=Apple Computer, L=Cupertino, S=California, C=US [Serial Number] 00 [Not Before] 09-12-2002 19:37:32 [Not After] 08-12-2007 19:37:32 [Thumbprint] FDFD5053616D49FEC9952E0930CAAB07BCD93952

System.Security.Cryptography.X509Certificates.X509Certificate

Undskyld den lange ventetid, men nu er jeg klar ved tasterne ;)
Avatar billede anders_cp Nybegynder
13. november 2009 - 15:28 #9
Authenticate Request.xml
-------------------------
- <soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"

xmlns:gsx="https://gsx.apple.com/cgi-bin/WebObjects/GSXWebServices.woa/ws/GSXWS">
  <soapenv:Header />
- <soapenv:Body>
- <gsx:Authenticate soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <userName xsi:type="xsd:string">username</userName>
  <password xsi:type="xsd:string">password</password>
  <accountNo xsi:type="xsd:string">soldto</accountNo>
  <language xsi:type="xsd:string">EN</language>
  <timeZone xsi:type="xsd:string">PST</timeZone>
  </gsx:Authenticate>
  </soapenv:Body>
  </soapenv:Envelope>




Authenticate Response.xml
-------------------------
- <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:Header>
  <ns1:wosid soapenv:actor="http://schemas.xmlsoap.org/soap/actor/next" soapenv:mustUnderstand="0"

xsi:type="soapenc:string" xmlns:ns1="http://www.apple.com/webobjects/webservices/soap/"

xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">CaQirGQ6SD00HCDNTFUaW0</ns1:wosid>
  <ns2:woinst soapenv:actor="http://schemas.xmlsoap.org/soap/actor/next" soapenv:mustUnderstand="0"

xsi:type="soapenc:string" xmlns:ns2="http://www.apple.com/webobjects/webservices/soap/"

xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">7</ns2:woinst>
  </soapenv:Header>
- <soapenv:Body>
- <ns3:AuthenticateResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

xmlns:ns3="https://gsx.apple.com/cgi-bin/WebObjects/GSXWebServices.woa/ws/GSXWS">
  <AuthenticateReturn href="#id0" />
  </ns3:AuthenticateResponse>
- <multiRef id="id0" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

xsi:type="ns4:SessionInfo" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"

xmlns:ns4="https://gsx.apple.com/GSXWS">
  <instanceID xsi:type="soapenc:string">7</instanceID>
  <sessionID xsi:type="soapenc:string">CaQirGQ6SD00HCDNTFUaW0</sessionID>
  </multiRef>
  </soapenv:Body>
  </soapenv:Envelope>
Avatar billede arne_v Ekspert
14. november 2009 - 04:11 #10
internal class MySecurityPolicy : ICertificatePolicy
        {

            public bool CheckValidationResult(ServicePoint sPoint, X509Certificate cert, WebRequest wRequest, int certProb)
            {
                // Load the certificate into an X509Certificate object.
                X509Certificate goodcert = new X509Certificate("ist-cacert.der");
                return cert == goodcert;
            }
        }

virker ikke ?
Avatar billede anders_cp Nybegynder
14. november 2009 - 12:34 #11
jo den kompilerer fint, men hvordan skal jeg kalde funktionen?
Jeg skal jo kalde den med de forskellige parametre.
Avatar billede arne_v Ekspert
14. november 2009 - 14:05 #12
Nej.

ServicePointManager.CertificatePolicy = new MySecurityPolicy();

gør at .NET selv kalde metoden med den rigtige parametre.
Avatar billede anders_cp Nybegynder
14. november 2009 - 15:37 #13
nåh ja det var også det du skrev i din indledning. Jeg har kørt den og forsøgt mig med breakpoints, men under debug springer den bare breakpointsene over, så jeg ved ikke hvad funktionen har returneret.
Avatar billede arne_v Ekspert
14. november 2009 - 15:45 #14
Put nogle Console.WriteLine ind i metoden (hvis console app) og se hvad der sker.
Avatar billede anders_cp Nybegynder
14. november 2009 - 15:56 #15
Det var en web-applikation, men nu har jeg også lavet den i konsole-version.
I web-applikationen fik jeg ikke lov til at skrive page.response.write inde i funktionen.
I konsole-versionen ser det ud til at funktionen ikke bliver kaldt. Der kommer ikke noget output andet end "efter security kaldet"

        static void Main(string[] args)
        {
            ServicePointManager.CertificatePolicy = new MySecurityPolicy();
            Console.WriteLine("efter security kaldet");
        }


        internal class MySecurityPolicy : ICertificatePolicy
        {

            public bool CheckValidationResult(ServicePoint sPoint, X509Certificate cert, WebRequest wRequest, int certProb)
            {
                Console.WriteLine("jfoewi");
                // Load the certificate into an X509Certificate object.
                X509Certificate goodcert = new X509Certificate("ist-cacert.der");
                Console.WriteLine(goodcert);
                Console.WriteLine(cert);
                return cert == goodcert;
            }
        }
Avatar billede arne_v Ekspert
14. november 2009 - 16:02 #16
Og du tilgår web servicen via HTTPS ?
Avatar billede anders_cp Nybegynder
14. november 2009 - 16:41 #17
https
webreference url = https://gsxit.apple.com/gsxws.wsdl
Avatar billede anders_cp Nybegynder
09. april 2011 - 18:32 #18
lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester