Walidacja zapytania HTTP Request

0

Siema siema. wysyłam zapytania przy pomocy SoapUI, soap mi zwraca całą odpowiedź i mogę się nią pobawić, ok. W c# chciałbym zrobić wysyłanie zapytań bez korzystania z SoapUI bo chciałbym zautomatyzować trochę wysyłanie zapytań, otrzymywanie odpowiedzi, pobieranie plików z odpowiedzi itd. ale jest jeden problem, serwer wymaga walidacji, która w soapUI jest zaznaczona w Auth -> Basic -> Outgoing WSS = walidacja, której wymaga serwer.

Macie może jakiś pomysł jak mogę prosto umieścić taką walidacje i wysłać ją razem z moim contentem?
Kod do zapytania wygląda następująco:

        public string postXMLData(string destinationUrl, string requestXml)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(destinationUrl);
            byte[] bytes;
            bytes = System.Text.Encoding.ASCII.GetBytes(requestXml);
            request.ContentType = "text/xml; encoding='utf-8'";
            request.ContentLength = bytes.Length;
            request.Method = "POST";
            Stream requestStream = request.GetRequestStream();
            requestStream.Write(bytes, 0, bytes.Length);
            requestStream.Close();
            HttpWebResponse response;
            response = (HttpWebResponse)request.GetResponse();
            if (response.StatusCode == HttpStatusCode.OK)
            {
                Stream responseStream = response.GetResponseStream();
                string responseStr = new StreamReader(responseStream).ReadToEnd();
                return responseStr;
            }
            return null;
        }

W odpowiedzi dostaje mniej więcej coś takiego

...<ns2:ErrorMessage>Job error: Request security validation failed.</ns2:ErrorMessage>...
0

Ref. Czy to aż takie trudne czy takie łatwe, ze nikt nie odpisał :P?

0

Słowa "auth" i "basic" wskazują na HTTP Auth. Potrzebujesz jak mniemam wysyłać jakąś nazwę użytkownika i hasło.

Obstawiam coś w stylu:

request.Credentials = new NetworkCredential("username", "password");

Aczkolwiek nie jestem pewien czy to działa "od razu" czy on dopiero automatycznie ponawia jeżeli serwer mu zwraca kod 401 (albo ten problem dotyczył tylko WebClient, nie HttpWebRequest).

0

Próbowałem już robić w ten sposób jednak bez skutku, dalej błąd związany z walidacją. Próbowałem to robić przez UsernameToken z WSE v3.0 ale przy próbie stworzenia nowego obiektu dla proxy wyskakuje mi błąd:

WebServiceBindingAttribute is required on proxy classes.
z tego kodu
Microsoft.Web.Services3.WebServicesClientProtocol abc = new WebServicesClientProtocol();

Pisali, że rozwiązać ten problem można wyłączając jakąś opcję serializacji we właściwościach projektu ale to też nic nie dało, tak jak i dodanie do klasy

[System.ComponentModel.DesignerCategoryAttribute("code")]

Bardzo proszę o pomoc bo naprawdę już brak mi pomysłów, przekopałem chyba wszystkie możliwe hasła do tego problemu :/

0

Spróbuj jeszcze ręcznie dodać nagłówek odpowiedzialny za uwierzytelnienie:

String username = "abc";
String password = "123";
String encoded = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(username + ":" + password));
request.Headers.Add("Authorization", "Basic " + encoded);

http://stackoverflow.com/questions/4334521/c-sharp-webrequest-authentication

0

Nic z tego :/, odnośnie tego problemu to całego stacka przejrzałem. Potrzebuję jakiejś biblioteki do autoryzacji WS-Security. Kod, który korzysta z .dll WSE v3.0 wygląda tak, lecz też nie działa:

UsernameToken userToken = new UsernameToken("user", "pass", PasswordOption.SendHashed);
Microsoft.Web.Services3.WebServicesClientProtocol abc = new WebServicesClientProtocol(); << w tym miejscu błąd "WebServiceBindingAttribute is required on proxy classes."
abc.RequestSoapContext.Security.Tokens.Add(userToken);
richTextBox2.Text = postXMLData("URL", richTextBox1.Text);

Naprawdę nie mam już pomysłów, bardzo proszę o wsparcie :P

1

Rozwiązałem problem, można zamknąć, dzięki Ktoś za próbę pomocy :)

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