В .NET, как вы предоставляете идентификатор сеанса для веб-службы, которая требует аутентификации? - PullRequest
3 голосов
/ 18 октября 2010

Я использую веб-сервис, который требует аутентификации из .NET (Visual Studio 2010).Согласно документации, вы сначала запрашиваете идентификатор сеанса у первого веб-сервиса.Я могу сделать это без проблем.Затем вы должны вызвать второй веб-сервис для фактического выполнения вашего запроса, передав идентификатор сессии в файле cookie.Вот мой пример кода:

AuthenticateService authenticate_service = new AuthenticateService();
string session_identifier = authenticate_service.Authenticate();

SearchService search_service = new SearchService();
search_service.CookieContainer = new CookieContainer();
Cookie cookie = new Cookie("Cookie", "SID=" + session_identifier, null, search_service.Url);
search_service.CookieContainer.Add(cookie);

search_service.Test();

Однако в последней строке я получаю следующее исключение:

System.Web.Services.Protocols.SoapException is nothandled Сообщение = значение файла cookie идентификатора сеанса не может быть нулевой или пустой строкой. Требуется, чтобы клиентская программа веб-службы высокого уровня участвовала в сеансе, инициализированном сервером.

Кто-нибудь знает, как правильно отправить файл cookie с помощьюидентификатор сеанса для веб-службы?

Ответы [ 2 ]

1 голос
/ 19 октября 2010

Просто разобрался ...

Все это было связано с параметром domain конструктора Cookie. Я проезжал search_service.Url, потому что я не был уверен, каким он должен быть. Видимо, это должно было быть что-то вроде "search.google.com". Когда я передал это конструктору, все начало работать как положено.

0 голосов
/ 19 октября 2010

Я нашел это где-то вдоль линии. Это веб-клиент с поддержкой cookie, который я использую. Это позволяет мне легко использовать WebClient и передавать файлы cookie.

public class CookieAwareWebClient : WebClient
{

    private CookieContainer m_container = new CookieContainer();

    protected override WebRequest GetWebRequest(Uri address)
    {
        WebRequest request = base.GetWebRequest(address);
        if (request is HttpWebRequest)
        {
            (request as HttpWebRequest).CookieContainer = m_container;
        }
        return request;
    }
}

Тогда вы можете просто использовать методы WebClient, и cookie передается автоматически после вашей аутентификации.

Пример кода:

CookieAwareWebClient webClient = new CookieAwareWebClient();    
NameValueCollection data = new System.Collections.Specialized.NameValueCollection();
data["user"] = "myusername"; //now holds a user=username map
byte[] response = webClient.UploadValues("http://localhost:8080/somewebservice/auth/","POST", data); //point to the webservice authentication URI

Теперь вы можете использовать webclient.UploadFile или UploadValues, или что угодно, предполагая, что предыдущая аутентификация была в порядке.

...