Неправильный запрос команды обеспечения Exchange ActiveSync Objective-C

Я провел дни проб и ошибок, просматривал журналы обмена и искал по всему Интернету и до сих пор не могу решить эту проблему.

Я реализую возможности ActiveSync в своем приложении для iOS и до сих пор успешно кодировал процесс автообнаружения и запрос HTTP OPTIONS, чтобы получить возможности сервера. Я сейчас пытаюсь запустить команду Provision, но продолжаю получать 400 Bad Request.

Вот что я отправляю на сервер:

URL: https://mobile.[myexchangeserver].com/Microsoft-Server-ActiveSync?Cmd=Provision&User=jack&DeviceID=123412341234&DeviceType=iOS

 Authorization = "Basic wekrju283j"; //Base 64 encoded auth, garbage for this posting
"Content-Length" = 104;
"Content-Type" = "application/vnd.ms-sync.wbxml";
"MS-ASProtocolVersion" = "12.1";
"User-Agent" = MyApp;
"X-MS-PolicyKey" = 0;

Body (converted to WBXML before sending):
<?xml version="1.0" encoding="utf-8"?>
<Provision xmlns="Provision:">
  <Policies>
    <Policy>
        <PolicyType>MS-EAS-Provisioning-WBXML</PolicyType>
    </Policy>
  </Policies>
</Provision>


WBXML: 02 00 25 6A 41 50 72 6F 76 69 73 69 6F 6E 00 50 6F 6C 69 63 69 65 73 00 50 6F 6C 69 63 79 00 50 6F 6C 69 63 79 54 79 70 65 00 2D 2F 2F 41 49 52 53 59 4E 43 2F 2F 44 54 44 20 41 69 72 53 79 6E 63 2F 2F 45 4E 00 44 00 44 0A 44 13 44 1A 03 4D 53 2D 45 41 53 2D 00 83 00 03 69 6E 67 2D 57 42 58 4D 4C 00 01 01 01 01

Могу ли я узнать больше, чем просто "Плохой запрос"? Или кто-то видит что-то не так с тем, что я посылаю? Сервер поддерживает протокол 12.1 (из запроса OPTIONS)

Я перечитывал документацию к протоколу снова и снова и до сих пор не могу найти ничего плохого в том, что я делаю. Я знаю, что я могу base64 кодировать параметры, но в соответствии с протоколами protocl, что является необязательным. Я также знаю, что в 14.1 мне нужно отправить больше информации в XML, поэтому я использую протокол 12.1.

Любая помощь с благодарностью.

3 ответа

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URI
                                                    cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:300.0];
NSString *msgLength = [NSString stringWithFormat:@"%d",[requestBodyData length]];
NSLog(@"Request Body Data Length: %@",msgLength);

[request setHTTPMethod:@"POST"];
[request setValue:mAuthStringFinal forHTTPHeaderField:@"Authorization"];
[request setValue:@"iPhone" forHTTPHeaderField:@"DeviceType"];
[request setValue:@"application/vnd.ms-sync.wbxml" forHTTPHeaderField:@"Content-Type"];
[request setValue:msgLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"12.1" forHTTPHeaderField:@"MS-ASProtocolVersion"];
[request setValue:@"*/*" forHTTPHeaderField:@"Accept"];
[request setValue:@"en-us" forHTTPHeaderField:@"Accept-Language"];
[request setValue:nil forHTTPHeaderField:@"X-MS-PolicyKey"];
[request setHTTPBody:requestBodyData];

NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];

/* ensure the connection was created */
if (connection)
{
    /* initialize the buffer */
    buffer = [NSMutableData data];

    /* start the request */
    [connection start];
}
else
{
    NSLog(@"Connection Failed");
}

Я добавил еще несколько заголовков в запрос POST и получаю 200 кодов состояния. Попробуй это! Но я не могу отправить содержимое запроса в виде wbxml, который, в свою очередь, предоставляет некоторые бессмысленные символы в ответ.

Пространство имен в вашей команде Provision выглядит неправильно. Это должно быть "Предоставление", а не "Предоставление:".

Я предполагаю, что вы получили XML из некоторых примеров Microsoft в документе [MS-ASPROV].pdf. Во многих случаях я обнаружил, что образцы XML от Microsoft содержат опечатки.

Извините, этот ответ пришел не намного раньше. Надеюсь, это может помочь кому-то еще в будущем.

Чтобы найти возможный ответ на этот вопрос, я потратил лучшую половину дня, отслеживая расплывчатые аргументы в пользу «плохого запроса» в моем случае, и это был идентификатор устройства. Максимальная длина идентификатора устройства составляет 16 символов - по крайней мере, для реализации Exchange ActiveSync 14.1 - несмотря на то, что в руководстве MS-ASHTTP указано 32 символа.

Не связано: что касается конечного двоеточия в именах пространств имен, я видел эту версию пространств имен во многих примерах. libwbxml также, кажется, ожидает этого или генерирует его в некоторых местах. Это очень необычно.

Другие вопросы по тегам