Avatar billede mungojerrie Nybegynder
24. februar 2005 - 16:12 Der er 14 kommentarer og
1 løsning

En lille forklaring af c# kode vedr. soap

Hej

Jeg har en ellers fin bog omkring .net og xml og jeg har læst en gennemgang om at sende en SOAP request via min C# kode og jeg har skrevet følgende udfra bogen, men noget af det er lidt uklart for mig, kan nogen hjælpe ? Se bemærkninger for de enkelte metoder..

Koden kommer her...

private const string soapNS = "http://schemas.xmlsoap.org/soap/envelope/";

//Denne har jeg rimelig styr på :-)
public static string CreateSoapEnvelope()
{
    string soap = "";
    MemoryStream stream = new MemoryStream();
    XmlTextWriter wr = new XmlTextWriter(stream, Encoding.UTF8);
    wr.WriteStartDocument();
        wr.WriteStartElement("soap", "Envelope", soapNS);
            wr.WriteStartElement("Body", soapNS);
                //her skal der komme flere tags.....                       
            wr.WriteEndElement(); // soap:Body
        wr.WriteEndElement();//soap:Envelope
    wr.WriteEndDocument();
    wr.Flush();
    stream.Seek(0,SeekOrigin.Begin);
    StreamReader reader = new StreamReader(stream);
    soap = reader.ReadToEnd();   
    return soap;
}

//Denne er også rimelig klar
public static HttpWebRequest CreateWebRequest(int length)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(ConfReader.VansURL);
    request.Method = "POST";
    request.ContentType = "text/xml; charset=" + Encoding.UTF8.HeaderName;
    request.ContentLength = length;
    request.Headers["SOAPAction"] = //Her kommer en URL;
    return request;
}

//Hvad er det lige der sker her ???????
public static void DoSomethingIdontKnow(HttpWebRequest r, string s)
{
    StreamWriter streamWriter = new StreamWriter(r.GetRequestStream());
    streamWriter.Write(s);
    streamWriter.Flush();
}

//Her får jeg en besked tilbage fra webservicen og tjekker om det er gået godt.....metoden er ikke skrevet færdig....
public static void HandleResponse(HttpWebRequest r)
{
    WebResponse response = r.GetResponse();
    Stream responseStream = response.GetResponseStream();
    System.Xml.XPath.XPathDocument document = new System.Xml.XPath.XPathDocument(responseStream);
    System.Xml.XPath.XPathNavigator nav = document.CreateNavigator();
    System.Xml.XPath.XPathNodeIterator nodes = nav.Select("//Envelope/Body/....");
    //Write something to log
}

public static void Main(string [] args)
{
    string soap = CreateSoapEnvelope();
    HttpWebRequest r = CreateWebRequest(soap.Length);
    DoSomethingIdontKnow(r, soap);
    HandleResponse(r);
}
Avatar billede arne_v Ekspert
24. februar 2005 - 16:18 #1
//Hvad er det lige der sker her ???????
public static void DoSomethingIdontKnow(HttpWebRequest r, string s)
{
    StreamWriter streamWriter = new StreamWriter(r.GetRequestStream());
    streamWriter.Write(s);
    streamWriter.Flush();
}

henter en OutputStream udfra din WebRequest, wrapper den i en StreamWriter,
skriver din streng og flusher det skrevne.

Kort sagt: den sender en streng over en HTTP connection.
Avatar billede mungojerrie Nybegynder
25. februar 2005 - 08:51 #2
Hej Arne
Du har jo svar på alt :-)

Et lille tillægsspørgsmål:
I min HandleResponse() tjekker jeg om der er nogen response fra min request, men jeg kontakter jo en server der godt kan ha lidt travlt, hvordan kan jeg vide hvornår der er en respons fra serveren. Altså skal jeg tjekke min response løbende eller hvordan ?
Avatar billede arne_v Ekspert
25. februar 2005 - 09:35 #3
Din HandleResponse er da så vidt jeg kan blocking d.v.s. at den vil vente
indtil der er et svar.
Avatar billede mungojerrie Nybegynder
25. februar 2005 - 09:39 #4
okay, hvordan ser du det ? Det står ikke lige i min ellers fine bog.....
Avatar billede arne_v Ekspert
25. februar 2005 - 09:45 #5
WebResponse response = r.GetResponse();
    Stream responseStream = response.GetResponseStream();

er så vidt jeg ved blocking !
Avatar billede mungojerrie Nybegynder
25. februar 2005 - 09:49 #6
Det var ikke fordi jeg tvivlede på dit udsagn, jeg ville bare gerne lære lidt om hvad det betyder at en respons er blocking...... :-)
Avatar billede arne_v Ekspert
25. februar 2005 - 09:51 #7
blocking = vent indtil der er noget

non blocking = returner med det samme og angiv i retur værdi om der var noget
Avatar billede mungojerrie Nybegynder
25. februar 2005 - 09:55 #8
okay, super..
hvis jeg så skal sende mange requests indenfor et kort tidsrum, lad os sige 100 requests til samme server indenfor 5 min, skal jeg så lave en respons object til hver af de 100 requests eller kan de benytte den samme respons obj  ?
Avatar billede arne_v Ekspert
25. februar 2005 - 09:58 #9
Så skal du nok til at kigge på multithreaded
Avatar billede mungojerrie Nybegynder
25. februar 2005 - 10:04 #10
multithreaded respons ??
Avatar billede arne_v Ekspert
25. februar 2005 - 10:27 #11
En thread per request/response pair
Avatar billede mungojerrie Nybegynder
25. februar 2005 - 11:50 #12
okay, det vil jeg lige grave lidt dybere i :-)
smid et svar for din hjælp
Avatar billede mungojerrie Nybegynder
25. februar 2005 - 11:58 #13
er der forresten noget specielt at tænke på i forbindelse med at lave en request til en HTTPS forbindelse eller det det samme som hvis man kontakter en alm http side ??
Avatar billede arne_v Ekspert
25. februar 2005 - 12:25 #14
Der kan godt være specielle problemer hvis din client ikke kender certifikatet.

Men prøv !
Avatar billede arne_v Ekspert
25. februar 2005 - 12:25 #15
svar
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
Kurser inden for grundlæggende programmering

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

IT-JOB