Jak wysłać SOAP ?

0

Chciałbym wysłać SOAP do chomikuj.pl , nie potrafię tego zrobić i chciałbym wiedzieć co robię źle.
Taki kod stworzyłem do tej pory (hasło jest w MD5):

        Dim manualWebClient As New System.Net.WebClient()

        manualWebClient.Headers.Add("SOAPAction", "http://chomikuj.pl/IChomikBoxService/Auth")
        manualWebClient.Headers.Add("Content-Type", "text/xml;charset=utf-8")
        manualWebClient.Headers.Add("User-Agent", "Mozilla/5.0")

        ' Note: don't put the <?xml... tag in--otherwise it will blow up with a 500 internal error message!
        Dim bytArguments As Byte() = System.Text.Encoding.ASCII.GetBytes( _
            "<s:Envelope xmlns:s=""http://schemas.xmlsoap.org/soap/envelope/"">" & System.Environment.NewLine & _
            "<s:Body>" & System.Environment.NewLine & _
            "Auth xmlns=""http://chomikuj.pl/"">" & System.Environment.NewLine & _
            "<name>[email protected]</name>" & System.Environment.NewLine & _
            "<passHash>" + MD5(password) + "</passHash>" & System.Environment.NewLine & _
            "<ver>4</ver>" & System.Environment.NewLine & _
            "<client>" & System.Environment.NewLine & _
            "<name>chomikbox</name>" & System.Environment.NewLine & _
            "<version>2.0.4.3</version>" & System.Environment.NewLine & _
            "</client>" & System.Environment.NewLine & _
            "</Auth>" & System.Environment.NewLine & _
            "</s:Body>" & System.Environment.NewLine & _
           "</s:Envelope>")
        Dim bytRetData As Byte() = manualWebClient.UploadData("http://box.chomikuj.pl/services/ChomikBoxService.svc", "POST", bytArguments)

        MsgBox(System.Text.Encoding.ASCII.GetString(bytRetData))
0

Brakuje ci przed "Auth" <. I nie wiem jak tworzysz hash ale powinno to wyglądać tak:
Sprawdziłem działa, token jest zwracany:

Imports System.Security.Cryptography
Imports System.Text

Module Module1

   Sub Main()
      Dim manualWebClient As New System.Net.WebClient()

      Dim [source] = "1234567890"
      Dim md5Hash As MD5 = MD5.Create()

      Dim hash As String = GetMd5Hash(md5Hash, source)

      manualWebClient.Headers.Add("SOAPAction", "http://chomikuj.pl/IChomikBoxService/Auth")
      manualWebClient.Headers.Add("Content-Type", "text/xml;charset=utf-8")
      manualWebClient.Headers.Add("User-Agent", "Mozilla/5.0")

      ' Note: don't put the <?xml... tag in--otherwise it will blow up with a 500 internal error message!
      Dim bytArguments As Byte() = System.Text.Encoding.ASCII.GetBytes(
          "<s:Envelope xmlns:s=""http://schemas.xmlsoap.org/soap/envelope/"">" & System.Environment.NewLine & _
          "<s:Body>" & System.Environment.NewLine & _
          "<Auth xmlns=""http://chomikuj.pl/"">" & System.Environment.NewLine & _
          "<name>[email protected]</name>" & System.Environment.NewLine & _
          "<passHash>" + hash + "</passHash>" & System.Environment.NewLine & _
          "<ver>4</ver>" & System.Environment.NewLine & _
          "<client>" & System.Environment.NewLine & _
          "<name>chomikbox</name>" & System.Environment.NewLine & _
          "<version>2.0.4.3</version>" & System.Environment.NewLine & _
          "</client>" & System.Environment.NewLine & _
          "</Auth>" & System.Environment.NewLine & _
          "</s:Body>" & System.Environment.NewLine & _
         "</s:Envelope>")

      Dim bytRetData As Byte() = manualWebClient.UploadData("http://box.chomikuj.pl/services/ChomikBoxService.svc", "POST", bytArguments)

      MsgBox(System.Text.Encoding.ASCII.GetString(bytRetData))
   
   End Sub

   Private Function GetMd5Hash(md5Hash As MD5, input As String) As String

      ' Convert the input string to a byte array and compute the hash.
      Dim data As Byte() = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input))
      Dim sBuilder As New StringBuilder()
      Dim i As Integer
      For i = 0 To data.Length - 1
         sBuilder.Append(data(i).ToString("x2"))
      Next i
      Return sBuilder.ToString()

   End Function

End Module
0

@DibbyDum
dodałem "<" przed auth ale nadal ten sam błąd mam:

Additional information: The remote server returned an error: (408) Request Timeout.

a md5 tworzę tak:

    Private Function MD5(ByRef strText As String) As String
        Dim MD5Service As New System.Security.Cryptography.MD5CryptoServiceProvider
        Dim bytes() As Byte = MD5Service.ComputeHash(System.Text.Encoding.ASCII.GetBytes(strText))
        Dim s As String
        For Each By As Byte In bytes
            s += By.ToString("x2")

        Next
        Return s
    End Function
0

Dziwne czasem na tym samym kodzie serwis odpowiada poprawnie czasem błędem nie wiem dla czego i nie bardzo mi się chce w to zagłębiać przy 2 -3 uruchomieniu już odpowiada okej, bez sensu. :
Capture.PNG

0

mi ani razu nie zadziałało ;/

1

A czemu tego nie zrobisz przez "Add service reference"?

0

@dam1an

dam1an napisał(a):

A czemu tego nie zrobisz przez "Add service reference"?

dopiero się uczę SOAPu, mógłbyś napisać dokładniej jak to zrobić i z czemu uważasz że tak będzie lepiej ?

0

Bo nie musisz sklejać tych farmazonów.
https://msdn.microsoft.com/en-us/library/bb386386.aspx
Zjedź niżej do Accessing the Service.

Edit: Sorry ale ten tutorial jest raczej słaby, nie mogę znaleźć takiego gdzie podawano by też parametry do requestu, chyba musisz sam wykminić.

1
Krzywy Młot napisał(a):

dopiero się uczę SOAPu, mógłbyś napisać dokładniej jak to zrobić i z czemu uważasz że tak będzie lepiej ?

Standardowo można to szybko zrobić klikasz prawym na projekcie -> "Add Service Reference" -> wklejasz w pasek adresu w twoim przypadku "http://box.chomikuj.pl/services/ChomikBoxService.svc" -> OK, i masz wygenerowanego klienta wraz z metodami do operowania na serwisie. Niestety wybrałeś sobie serwis który nie udostępnia wsdla i nie możesz tego zrobić. ;) Więc skoro się uczysz to wybierz API które jest dostępne dla osób trzecich a nie koniecznie to chomikowe które jest ukryte i trzeba kombinować.

0

@DibbyDum @dam1an

Dziękuję za wyczerpujące odpowiedzi..
a mam jeszcze takie pytanko - podczas wysyłania tego SOAPu cała aplikacja tak jakby się przycina do czasu otrzymania odpowiedzi od serwera...
Od czego to jest zależne i jak wyeliminować te "przywieszanie się" aplikacji ?
Aby wysyłało to gdzieś w tle i nie miało tak drastycznego wpływu na działanie aplikacji.

0

Zamiast manualWebClient.UploadData, użyj await manualWebClient.UplaodDataTaskAsync

0
some_ONE napisał(a):

Zamiast manualWebClient.UploadData, użyj await manualWebClient.UplaodDataTaskAsync

@some_ONE
nigdy wcześniej nie bawiłem się z async, czy mógłbyś podpowiedzieć jak poprawnie tego użyć?
user image

0

dodałem przed "Async" przed "Sub" ale teraz coś to wadliwie działa.

0

Wadliwie tzn. ?

0

@some_ONE
ok poradziłem sobie, po prostu rozumiem że to działa asynchronicznie teraz?
no i zmienne były przekazywane z pętli For a więc pętla przechodziła dalej i zmienna miała inną wartość ... a co za tym idzie wynik soapu był z kolejnej wartości pętli :P
wystarczyło dodać nową zmienną :)

bardzo fajnie to działa :) Wielkie dzięki za wskazówki ! :)

@some_ONE
pomimo że problem już z głowy to ciekawośc mnie meczy...
wracając do pytania z innego tematu:
http://4programmers.net/Forum/Newbie/266236-kilka_pytan_-_c
napisałeś mi, że treść o wszystkim mówi, no i szukałem i szukałem w internecie i czytałem o delagatach ale za nic nie potrafię tego użyć, mógłbyś mnie nakierować jak rozwiązać sytuację z poprzedniego tematu ? (chodzi o zastosowanie wątków)
user image

0

Skorzystaj z Invoke/InvokeRequired tak jak pisał @_13th_Dragon w tamtym temacie.
Znajdziesz przykłady.

0

@some_ONE
Czyli zamiast standardowego:
RichTextBox4.Text = ""

muszę zrobić coś takiego?
SetRichtextboxText("")

    Private Sub SetRichtextboxText(ByVal text As String)
        If Label1.InvokeRequired Then
            RichTextBox4.Invoke(New Action(Of String)(AddressOf SetRichtextboxText), text)
        Else
            RichTextBox4.Text = text

        End If
    End Sub

Trochę dużo zabawy z tym...a co w takim razie z pętlą?

        For Each line In RichTextBox2.Lines
            RichTextBox4.Text = (RichTextBox4.Text + vbNewLine + "$^^" + line + "$^^").Trim
        Next

nie mam pojęcia jak tego tu użyć

1 użytkowników online, w tym zalogowanych: 0, gości: 1