Как я могу сделать HTTPWebRequest для веб-службы ASP.NET и показать, что я вошел в этот домен? - PullRequest
3 голосов
/ 28 января 2009

У меня есть веб-сервис, к которому я могу подключиться, только если захожу на веб-сайт, на котором он включен. Мне нужно проверить сервис удаленно. Итак, я написал некоторый код для создания поддельной сессии, которая регистрируется на сайте в другом браузере. Затем я сделал HTTP веб-запрос и пытаюсь установить cookie, который содержит идентификатор сеанса ASP.NET для этого вошедшего в систему пользователя. Но веб-служба не обнаруживает, что веб-запрос является зарегистрированным пользователем или сеансом. Что мне нужно дать веб-сервису, чтобы убедить его, что это действительный сеанс?

// used on each read operation

byte[] buf = new byte[8192];

CookieContainer myContainer = new CookieContainer();

string sessionID = SessionID;

myContainer.Add(new Cookie("ASP.NET_SessionId", sessionID, "/", WebsiteUrl));

// prepare the web page we will be asking for
HttpWebRequest request = (HttpWebRequest)
    WebRequest.Create(CreateWebserviceUrl("doneScreenScore"));
request.ContentType = "text/xml; charset=utf-8";            
request.Method = "POST";
request.Accept = "text/xml";
request.Headers.Add("SOAPAction", "http://detectent.net/doneScreenScore");

request.CookieContainer = myContainer;

Stream s = request.GetRequestStream();

string soaprequest = "";
soaprequest += "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
soaprequest += "<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">";
soaprequest += "  <soap12:Body>";
soaprequest += "    <doneScreenScore xmlns=\"http://detectent.net/\">";
soaprequest += "      <input1>string</input1>";
soaprequest += "<input2>string</input2>";
soaprequest += "<input3>string</input3>";
soaprequest += "<input4>string</input4>";
soaprequest += "</doneScreenScore>";
soaprequest += "</soap12:Body>";
soaprequest += "</soap12:Envelope>";

s.Write(System.Text.Encoding.ASCII.GetBytes(soaprequest), 0, soaprequest.Length);

s.Close();

// execute the request
HttpWebResponse response = (HttpWebResponse)
    request.GetResponse();

// we will read data via the response stream
Stream resStream = response.GetResponseStream();
string responseFromWebServiceCall = ReadResponseStream(resStream);

Ответы [ 3 ]

1 голос
/ 28 января 2009

Я думаю, что вы можете сделать что-то с учетными данными ... Я делаю это для веб-службы ...

rpt.Credentials = new System.Net.NetworkCredential(UserName, Password, Domain);

1 голос
/ 28 января 2009

Сам я не возиться с этой штукой и не могу точно сказать, почему она не работает. Однако я немного поработал над написанием приложений, которые маскируются под типичного пользователя для целей тестирования, и инструмент, с которым я бы порекомендовал вам ознакомиться, называется WireShark. (Ранее известный как Ethereal)

WireShark - анализатор пакетов. Если вы запустите его во время просмотра веб-сайта в обычном режиме, вы сможете увидеть все данные, передаваемые назад и вперед между вашим браузером и веб-сервером. После того, как вы нашли информацию, необходимую для отправки запроса в этот веб-сервис, у вас не должно возникнуть проблем при создании правильного веб-запроса, который ведет себя таким же образом.

Вы можете скачать WireShark с официального сайта .

0 голосов
/ 28 января 2009

NetworkCredentials работают, если веб-сайт использует проверку подлинности Windows.

Я имел разные успехи, выдавая себя за браузер, когда делал подобные вещи. Обычно я должен сначала сделать правильный запрос к их странице входа. Ответ будет содержать cookie с идентификатором SessionID. Пока я повторно использую один и тот же CookieCollection для всех запросов после этого (т. Е. Один глобальный CookieCollection, который повторно используется каждый запрос), он будет работать нормально.

В странном случае я все еще нахожу, что веб-сайт не распознает мой недавно вошедший сеанс. В этом случае я вручную авторизируюсь с помощью FireFox и использую панель инструментов WebDeveloper для просмотра файлов cookie. Я беру имя / значение файла cookie и помещаю их в настройки приложения, которые используются программой для заполнения коллекции файлов cookie.

Удостоверьтесь, что вы также подделали действительный пользовательский агент. У меня были сайты, из-за которых мне тоже отказывали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...