Опубликовать в Rest Webservice с Windows Phone 7

Я хочу сделать POST с Rest Webservice. Сервис построен с использованием NetweaverGateway и используется для серверной части SAP. Чтобы сделать сообщение, во-первых, нужно выполнить GET со значением заголовка «X-CSRF» в качестве Fetch. Я буду получать значение для этого заголовка и должен пройти во время POST. Также я буду получать значение для Set-Cookie header.И нужно применять как заголовок Cookie во время POST.

Значение Set-Cookie Header для Windows Phone показано ниже.

MYSAPSSO2 = AjQxMDMBABhBAFAAUABEAEUAVgBFAEwATwBQACAAIAACAAY4ADAAMAADABBJAEQANQAgACAAIAAgACAABAAYMgAwADEANAAwADEAMQA0ADEAMgAzADcABQAEAAAACAYAAlgACQACRQD% 2fAVYwggFSBgkqhkiG9w0BBwKgggFDMIIBPwIBATELMAkGBSsOAwIaBQAwCwYJKoZIhvcNAQcBMYIBHjCCARoCAQEwbzBkMQswCQYDVQQGEwJERTEcMBoGA1UEChMTU0FQIFRydXN0IENvbW11bml0eTETMBEGA1UECxMKU0FQIFdlYiBBUzEUMBIGA1UECxMLSTAwMjA1NzgyMDkxDDAKBgNVBAMTA0lENQIHIBIRIAZSCDAJBgUrDgMCGgUAoF0wGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMTQwMTE0MTIzNzI2WjAjBgkqhkiG9w0BCQQxFgQUl9pQNO3% 21xAL961k5uldlrK9v4F4wCQYHKoZIzjgEAwQvMC0CFQC1Y2P0KidZPdz9cEDXfcJQXfaZHQIUSrgfviQp8crDmko2WfC5fRDIgLc% 3d; путь=/; домен = .168.3.10, SAP_SESSIONID_ID5_800 = 2kvgSUGIpZ2YFXaubeuff5zTKwp9GBHjn-AAJlUa2wA%3d; путь=/

Значение заголовка Set-Cookie, как показано ниже, в случае консольного приложения Windows.

MYSAPSSO2 = AjQxMDMBABhBAFAAUABEAEUAVgBFAEwATwBQACAAIAACAAY4ADAAMAADABBJAEQANQAgACAAIAAgACAABAAYMgAwADEANAAwADEAMQA0ADEAMgAzADkABQAEAAAACAYAAlgACQACRQD% 2fAVYwggFSBgkqhkiG9w0BBwKgggFDMIIBPwIBATELMAkGBSsOAwIaBQAwCwYJKoZIhvcNAQcBMYIBHjCCARoCAQEwbzBkMQswCQYDVQQGEwJERTEcMBoGA1UEChMTU0FQIFRydXN0IENvbW11bml0eTETMBEGA1UECxMKU0FQIFdlYiBBUzEUMBIGA1UECxMLSTAwMjA1NzgyMDkxDDAKBgNVBAMTA0lENQIHIBIRIAZSCDAJBgUrDgMCGgUAoF0wGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMTQwMTE0MTIzOTIyWjAjBgkqhkiG9w0BCQQxFgQU7c96Mnc03Z93lKsX929FWOrxYdswCQYHKoZIzjgEAwQvMC0CFQDXaD% 2frrpLCCvzU85bLT1Km4NBUgAIUUwVjlcngGRjw5O3iPAr8GST2Oww% 3d; путь=/; домен = .168.3.10, SAP_SESSIONID_ID5_800 = dbbs5TYL4SVjK4oZuPu5W-RZtwh9GBHjn-AAJlUa2wA%3d; path=/,sap-XSRF_ID5_800=3_UuV7y6z8bidVbm0rszQQ%3d%3d20140114123922ryOO43OgtywearpQUbML8YgnytbuW3-Qs0Jt4tuOgcc%3d; путь=/; HttpOnly

Мне нужно значение заголовка sap-XSRF_ID5_800 из Set-Cookie для POST. К сожалению, в случае Windows Phone такого значения нет. И я получаю ошибку аутентификации при публикации.

То же самое работает и в случае консольного приложения.

Нужна помощь по этому поводу. Я попытался с решением, указанным здесь

Но я не могу получить доступ к файлам cookie.

Обновление:

Ниже мой код

    string xToken = "";
                byte[] auth = Encoding.UTF8.GetBytes(UserName + ":" + Pwd);
                string postXml = "xml to post";


                HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.example.com/Headers");

                byte[] byteArray = Encoding.UTF8.GetBytes(postXml);
                request.ContentType = "application/atom+xml";
                request.Method = "GET";
                request.Headers["Authorization"] = "Basic " + System.Convert.ToBase64String(auth);
                request.Headers["X-CSRF-Token"] = "Fetch";



                HttpWebResponse responseH = (HttpWebResponse)request.GetResponse();
                xToken = responseH.Headers["X-CSRF-Token"];
                responseH.Close();
                request.Method = "POST";
                request.Headers["Authorization"] = "Basic " +    System.Convert.ToBase64String(auth);
                request.Headers["X-CSRF-Token"] = xToken;

 Stream dataStream1 = request.GetRequestStream();
                dataStream1.Write(byteArray, 0, byteArray.Length);
                dataStream1.Close();
                HttpWebResponse response1 = (HttpWebResponse)request.GetResponse();
                Console.WriteLine(((HttpWebResponse)response1).StatusDescription);
                dataStream1 = response1.GetResponseStream();
                StreamReader reader1 = new StreamReader(dataStream1);
                string responseFromServer1 = reader1.ReadToEnd();
                Console.WriteLine(responseFromServer1);
                Console.Read();
                reader1.Close();
                dataStream1.Close();
                response1.Close();

person Praveen    schedule 14.01.2014    source источник


Ответы (1)


Вы не должны получать доступ к файлам cookie, и вам это не нужно. Пока вы используете тот же экземпляр HttpClient для выполнения POST, что и для GET, они будут использовать один и тот же HttpClientHandler, у которого есть CookieContainer.

Заголовок Set-Cookie в ответе на GET добавит файл cookie в контейнер файлов cookie, а ваш следующий POST (с тем же экземпляром HttpClient) добавит файл cookie в заголовок.

person Darrel Miller    schedule 14.01.2014
comment
Если я использую тот же экземпляр HttpClient, во время POST, когда я устанавливаю ContentLength, я получаю исключение недопустимой операции. Это свойство нельзя установить после начала записи. - person Praveen; 15.01.2014
comment
@Praveen Вам никогда не нужно устанавливать заголовок длины содержимого. Он будет установлен для вас фреймворком. - person Darrel Miller; 15.01.2014
comment
если я это сделаю, я получаю исключение. Не могу отправить тело содержимого с этим типом глагола. при записи данных в поток - person Praveen; 15.01.2014
comment
Я обновил свой вопрос своим кодом. Если есть ошибка, сообщите мне. - person Praveen; 15.01.2014