iosxmloffice365exchangewebservicesrapidxml

EWS GetStreamingEvents. Response is received only by timeout


In my iOS app I'm trying to get streaming events from EWS following this manual. So first I subscribe for notifications, receive a subscription id and then perform GetStreamingEvents request. The subscription process is successful, however getting streaming events is not. I receive a response only by timeout. Yes, it does contain all the notifications, so no problems with that but I expect to receive a response once an event has occurred not when the request time is up.

So I launched Charles and examined the traffic of Mac Mail app. I can see that it receives one response right after making GetStreamingEvents request and then it successfully receives responses every time an event has occurred as expected. So I made my XML look exactly like Mac Mail app's but still no luck.

This is my Subscribe xml:

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<soap:Header>
  <t:RequestedServerVersion Version="Exchange2010_SP2" />
</soap:Header>
<soap:Body>
  <m:Subscribe xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages">
     <m:StreamingSubscriptionRequest SubscribeToAllFolders="true">
        <t:EventTypes>
           <t:EventType>CopiedEvent</t:EventType>
           <t:EventType>CreatedEvent</t:EventType>
           <t:EventType>DeletedEvent</t:EventType>
           <t:EventType>ModifiedEvent</t:EventType>
           <t:EventType>MovedEvent</t:EventType>
           <t:EventType>NewMailEvent</t:EventType>
           <t:EventType>FreeBusyChangedEvent</t:EventType>
        </t:EventTypes>
     </m:StreamingSubscriptionRequest>
  </m:Subscribe>
  </soap:Body>
</soap:Envelope>

and this is my GetStreamingEvents xml:

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<soap:Header>
  <t:RequestServerVersion Version="Exchange2010_SP2" />
</soap:Header>
<soap:Body>
  <m:GetStreamingEvents xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages">
     <m:SubscriptionIds>
        <t:SubscriptionId>JwBkYjVwcjA2bWIxNDY0LmV1cnByZDA2LnByb2Qub3V0bG9vay5jb20QAAAAF9r7tBXj+U+UapGUZ4XFytKbA+ad1dQIEAAAAMiCIP/mQqJOjzx9Aog45Fk=</t:SubscriptionId>
     </m:SubscriptionIds>
     <m:ConnectionTimeout>30</m:ConnectionTimeout>
  </m:GetStreamingEvents>
  </soap:Body>
  </soap:Envelope>

Any ideas, guys?

UPDATE:

This is how I build my subscription:

bcstring SubscribeRequestMessage::buildSoapRequest() const
{
xml_document<> doc;
xml_node<>* decl = doc.allocate_node(node_declaration);
decl->append_attribute(doc.allocate_attribute("version", "1.0"));
decl->append_attribute(doc.allocate_attribute("encoding", "utf-8"));
doc.append_node(decl);

// Envelope
xml_node<>* envelope = doc.allocate_node(node_element, "soap:Envelope");
envelope->append_attribute(doc.allocate_attribute("xmlns:soap", "http://schemas.xmlsoap.org/soap/envelope/"));
envelope->append_attribute(doc.allocate_attribute("xmlns:t", "http://schemas.microsoft.com/exchange/services/2006/types"));

doc.append_node(envelope);
{
    // Header
    xml_node<>* header = doc.allocate_node(node_element, "soap:Header");
    {
        xml_node<>* reqServerVersion = doc.allocate_node(node_element, "t:RequestedServerVersion");
        xml_attribute<>* serverVersionAttribute = doc.allocate_attribute("Version", m_requestedServerVersion.c_str());
        reqServerVersion->append_attribute(serverVersionAttribute);
        header->append_node(reqServerVersion);
    }
    envelope->append_node(header);

    // Body
    xml_node<>* body = doc.allocate_node(node_element, "soap:Body");
    {
        xml_node<>* subscribe = doc.allocate_node(node_element, "m:Subscribe");
        {
            subscribe->append_attribute(doc.allocate_attribute("xmlns:m", "http://schemas.microsoft.com/exchange/services/2006/messages"));

            xml_node<>* streamingSubscriptionRequest = doc.allocate_node(node_element, "m:StreamingSubscriptionRequest");
            {

                if (m_folderIds.size() > 0)
                {
                    xml_node<>* folderIds = doc.allocate_node(node_element, "t:FolderIds");
                    {
                        for (const bcstring& folderId : m_folderIds)
                        {
                            xml_node<>* folderIdNode = doc.allocate_node(node_element, "t:FolderId");
                            folderIdNode->append_attribute(doc.allocate_attribute("Id", folderId.c_str()));
                            folderIds->append_node(folderIdNode);
                        }
                    }
                    streamingSubscriptionRequest->append_node(folderIds);
                }
                else
                {
                    xml_attribute<>* subscribeToAll = doc.allocate_attribute("SubscribeToAllFolders", "true");
                    streamingSubscriptionRequest->append_attribute(subscribeToAll);
                }
                xml_node<>* eventTypes = doc.allocate_node(node_element, "t:EventTypes");
                {
                    for (const bcstring& eventType : m_eventTypes)
                    {
                        xml_node<>* eventTypeNode      = doc.allocate_node(node_element, "t:EventType");
                        xml_node<>* eventTypeValueNode = doc.allocate_node(node_data, "", eventType.c_str());
                        eventTypeNode->append_node(eventTypeValueNode);
                        eventTypes->append_node(eventTypeNode);
                    }
                }
                streamingSubscriptionRequest->append_node(eventTypes);
            }
            subscribe->append_node(streamingSubscriptionRequest);
        }

        body->append_node(subscribe);
    }
    envelope->append_node(body);
}

bcstring retVal;
print(std::back_inserter(retVal), doc, print_no_indenting);

return retVal;
}

and this is how I build get streaming xml:

bcstring GetStreamingEventsRequest::buildSoapRequest() const
{
xml_document<> doc;
xml_node<>* decl = doc.allocate_node(node_declaration);
decl->append_attribute(doc.allocate_attribute("version", "1.0"));
decl->append_attribute(doc.allocate_attribute("encoding", "utf-8"));
doc.append_node(decl);

// Envelope
xml_node<>* envelope = doc.allocate_node(node_element, "soap:Envelope");
envelope->append_attribute(doc.allocate_attribute("xmlns:soap", "http://schemas.xmlsoap.org/soap/envelope/"));
envelope->append_attribute(doc.allocate_attribute("xmlns:t", "http://schemas.microsoft.com/exchange/services/2006/types"));

doc.append_node(envelope);
{
    // Header
    xml_node<>* header = doc.allocate_node(node_element, "soap:Header");
    {
        xml_node<>* reqServerVersion = doc.allocate_node(node_element, "t:RequestServerVersion");
        xml_attribute<>* serverVersionAttribute = doc.allocate_attribute("Version", m_requestedServerVersion.c_str());
        reqServerVersion->append_attribute(serverVersionAttribute);
        header->append_node(reqServerVersion);
    }
    envelope->append_node(header);

    // Body
    xml_node<>* body = doc.allocate_node(node_element, "soap:Body");
    {
        xml_node<>* getStreamingEvents = doc.allocate_node(node_element, "m:GetStreamingEvents");
        {
            getStreamingEvents->append_attribute(doc.allocate_attribute("xmlns:m", "http://schemas.microsoft.com/exchange/services/2006/messages"));

            xml_node<>* subscriptionIds = doc.allocate_node(node_element, "m:SubscriptionIds");
            {
                for (const bcstring& subscriptionId : m_subscriptionIds)
                {
                    xml_node<>* subscriptionIdNode  = doc.allocate_node(node_element, "t:SubscriptionId");
                    xml_node<>* subscriptionIdValue = doc.allocate_node(node_data, "", subscriptionId.c_str());
                    subscriptionIdNode->append_node(subscriptionIdValue);
                    subscriptionIds->append_node(subscriptionIdNode);
                }
            }

            getStreamingEvents->append_node(subscriptionIds);

            xml_node<>* connectionTimeout      = doc.allocate_node(node_element, "m:ConnectionTimeout");
            bcstring connectionTimeoutString   = std::to_string(m_connectionTimeout);
            xml_node<>* connectionTimeoutValue = doc.allocate_node(node_data, "", connectionTimeoutString.c_str());
            connectionTimeout->append_node(connectionTimeoutValue);
            getStreamingEvents->append_node(connectionTimeout);
        }

        body->append_node(getStreamingEvents);
    }
    envelope->append_node(body);
}

bcstring retVal;
print(std::back_inserter(retVal), doc, print_no_indenting);

return retVal;
}

UPDATE:

This is the XML of Mac Mail app that I see via Charles: Subscription:

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<soap:Header>
  <t:RequestServerVersion Version="Exchange2010_SP2" />
</soap:Header>
<soap:Body>
  <m:Subscribe xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages">
     <m:StreamingSubscriptionRequest SubscribeToAllFolders="true">
        <t:EventTypes>
           <t:EventType>CopiedEvent</t:EventType>
           <t:EventType>CreatedEvent</t:EventType>
           <t:EventType>DeletedEvent</t:EventType>
           <t:EventType>ModifiedEvent</t:EventType>
           <t:EventType>MovedEvent</t:EventType>
           <t:EventType>NewMailEvent</t:EventType>
           <t:EventType>FreeBusyChangedEvent</t:EventType>
        </t:EventTypes>
     </m:StreamingSubscriptionRequest>
  </m:Subscribe>
  </soap:Body>
  </soap:Envelope>

and streaming:

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<soap:Header>
  <t:RequestServerVersion Version="Exchange2010_SP2" />
</soap:Header>
<soap:Body>
  <m:GetStreamingEvents xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages">
     <m:SubscriptionIds>
        <t:SubscriptionId>JwBkYjVwcjA2bWIxNDY0LmV1cnByZDA2LnByb2Qub3V0bG9vay5jb20QAAAADv7qpS0xbU6V0mCxt2SvFHYOYoCq1dQIEAAAAMiCIP/mQqJOjzx9Aog45Fk=</t:SubscriptionId>
     </m:SubscriptionIds>
     <m:ConnectionTimeout>30</m:ConnectionTimeout>
  </m:GetStreamingEvents>
  </soap:Body>
  </soap:Envelope>

and this is the response from EWS arriving upon timeout and containing a notification about a new mail:

<Envelope
xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<soap11:Header
    xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/">
    <ServerVersionInfo
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" MajorVersion="15" MinorVersion="1" MajorBuildNumber="1282" MinorBuildNumber="22" Version="V2017_04_14"
        xmlns="http://schemas.microsoft.com/exchange/services/2006/types" />
    </soap11:Header>
    <soap11:Body
        xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/">
        <m:GetStreamingEventsResponse
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
            xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages">
            <m:ResponseMessages>
                <m:GetStreamingEventsResponseMessage ResponseClass="Success">
                    <m:ResponseCode>NoError</m:ResponseCode>
                    <m:ConnectionStatus>OK</m:ConnectionStatus>
                </m:GetStreamingEventsResponseMessage>
            </m:ResponseMessages>
        </m:GetStreamingEventsResponse>
    </soap11:Body>
</Envelope>
<Envelope
    xmlns="http://schemas.xmlsoap.org/soap/envelope/">
    <soap11:Header
        xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/">
        <ServerVersionInfo
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" MajorVersion="15" MinorVersion="1" MajorBuildNumber="1282" MinorBuildNumber="22" Version="V2017_04_14"
            xmlns="http://schemas.microsoft.com/exchange/services/2006/types" />
        </soap11:Header>
        <soap11:Body
            xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/">
            <m:GetStreamingEventsResponse
                xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
                xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages">
                <m:ResponseMessages>
                    <m:GetStreamingEventsResponseMessage ResponseClass="Success">
                        <m:ResponseCode>NoError</m:ResponseCode>
                        <m:Notifications>
                            <m:Notification>
                                <t:SubscriptionId>JwBkYjVwcjA2bWIxNDY0LmV1cnByZDA2LnByb2Qub3V0bG9vay5jb20QAAAA4mbQZqHZf0aA35Z5r1UEvPZtJfmw1dQIEAAAAMiCIP/mQqJOjzx9Aog45Fk=</t:SubscriptionId>
                                <t:CreatedEvent>
                                    <t:TimeStamp>2017-07-28T12:06:04Z</t:TimeStamp>
                                    <t:ItemId Id="AAMkAGZmMjA4MmM4LTQyZTYtNGVhMi04ZjNjLTdkMDI4ODM4ZTQ1OQBGAAAAAADKa2Su6/EXRrsmOefDSCL3BwBEITO0krAyRbRmLsC3JNeGAAAAAAEMAABEITO0krAyRbRmLsC3JNeGAAAdPAOsAAA=" ChangeKey="CQAAAA==" />
                                    <t:ParentFolderId Id="AAMkAGZmMjA4MmM4LTQyZTYtNGVhMi04ZjNjLTdkMDI4ODM4ZTQ1OQAuAAAAAADKa2Su6/EXRrsmOefDSCL3AQBEITO0krAyRbRmLsC3JNeGAAAAAAEMAAA=" ChangeKey="AQAAAA==" />
                                </t:CreatedEvent>
                                <t:NewMailEvent>
                                    <t:TimeStamp>2017-07-28T12:06:04Z</t:TimeStamp>
                                    <t:ItemId Id="AAMkAGZmMjA4MmM4LTQyZTYtNGVhMi04ZjNjLTdkMDI4ODM4ZTQ1OQBGAAAAAADKa2Su6/EXRrsmOefDSCL3BwBEITO0krAyRbRmLsC3JNeGAAAAAAEMAABEITO0krAyRbRmLsC3JNeGAAAdPAOsAAA=" ChangeKey="CQAAAA==" />
                                    <t:ParentFolderId Id="AAMkAGZmMjA4MmM4LTQyZTYtNGVhMi04ZjNjLTdkMDI4ODM4ZTQ1OQAuAAAAAADKa2Su6/EXRrsmOefDSCL3AQBEITO0krAyRbRmLsC3JNeGAAAAAAEMAAA=" ChangeKey="AQAAAA==" />
                                </t:NewMailEvent>
                                <t:ModifiedEvent>
                                    <t:TimeStamp>2017-07-28T12:06:04Z</t:TimeStamp>
                                    <t:FolderId Id="AAMkAGZmMjA4MmM4LTQyZTYtNGVhMi04ZjNjLTdkMDI4ODM4ZTQ1OQAuAAAAAADKa2Su6/EXRrsmOefDSCL3AQBEITO0krAyRbRmLsC3JNeGAAAAAAEMAAA=" ChangeKey="AQAAAA==" />
                                    <t:ParentFolderId Id="AAMkAGZmMjA4MmM4LTQyZTYtNGVhMi04ZjNjLTdkMDI4ODM4ZTQ1OQAuAAAAAADKa2Su6/EXRrsmOefDSCL3AQBEITO0krAyRbRmLsC3JNeGAAAAAAEIAAA=" ChangeKey="AQAAAA==" />
                                    <t:UnreadCount>1</t:UnreadCount>
                                </t:ModifiedEvent>
                            </m:Notification>
                        </m:Notifications>
                    </m:GetStreamingEventsResponseMessage>
                </m:ResponseMessages>
            </m:GetStreamingEventsResponse>
        </soap11:Body>
    </Envelope>
    <Envelope
        xmlns="http://schemas.xmlsoap.org/soap/envelope/">
        <soap11:Header
            xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/">
            <ServerVersionInfo
                xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" MajorVersion="15" MinorVersion="1" MajorBuildNumber="1282" MinorBuildNumber="22" Version="V2017_04_14"
                xmlns="http://schemas.microsoft.com/exchange/services/2006/types" />
            </soap11:Header>
            <soap11:Body
                xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/">
                <m:GetStreamingEventsResponse
                    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                    xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
                    xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages">
                    <m:ResponseMessages>
                        <m:GetStreamingEventsResponseMessage ResponseClass="Success">
                            <m:ResponseCode>NoError</m:ResponseCode>
                            <m:ConnectionStatus>OK</m:ConnectionStatus>
                        </m:GetStreamingEventsResponseMessage>
                    </m:ResponseMessages>
                </m:GetStreamingEventsResponse>
            </soap11:Body>
        </Envelope>
        <Envelope
            xmlns="http://schemas.xmlsoap.org/soap/envelope/">
            <soap11:Header
                xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/">
                <ServerVersionInfo
                    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" MajorVersion="15" MinorVersion="1" MajorBuildNumber="1282" MinorBuildNumber="22" Version="V2017_04_14"
                    xmlns="http://schemas.microsoft.com/exchange/services/2006/types" />
                </soap11:Header>
                <soap11:Body
                    xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/">
                    <m:GetStreamingEventsResponse
                        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                        xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
                        xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages">
                        <m:ResponseMessages>
                            <m:GetStreamingEventsResponseMessage ResponseClass="Success">
                                <m:ResponseCode>NoError</m:ResponseCode>
                                <m:ConnectionStatus>OK</m:ConnectionStatus>
                            </m:GetStreamingEventsResponseMessage>
                        </m:ResponseMessages>
                    </m:GetStreamingEventsResponse>
                </soap11:Body>
            </Envelope>
            <Envelope
                xmlns="http://schemas.xmlsoap.org/soap/envelope/">
                <soap11:Header
                    xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/">
                    <ServerVersionInfo
                        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" MajorVersion="15" MinorVersion="1" MajorBuildNumber="1282" MinorBuildNumber="22" Version="V2017_04_14"
                        xmlns="http://schemas.microsoft.com/exchange/services/2006/types" />
                    </soap11:Header>
                    <soap11:Body
                        xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/">
                        <m:GetStreamingEventsResponse
                            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                            xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
                            xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages">
                            <m:ResponseMessages>
                                <m:GetStreamingEventsResponseMessage ResponseClass="Success">
                                    <m:ResponseCode>NoError</m:ResponseCode>
                                    <m:Notifications>
                                        <m:Notification>
                                            <t:SubscriptionId>JwBkYjVwcjA2bWIxNDY0LmV1cnByZDA2LnByb2Qub3V0bG9vay5jb20QAAAA4mbQZqHZf0aA35Z5r1UEvPZtJfmw1dQIEAAAAMiCIP/mQqJOjzx9Aog45Fk=</t:SubscriptionId>
                                            <t:ModifiedEvent>
                                                <t:TimeStamp>2017-07-28T12:07:39Z</t:TimeStamp>
                                                <t:ItemId Id="AAMkAGZmMjA4MmM4LTQyZTYtNGVhMi04ZjNjLTdkMDI4ODM4ZTQ1OQBGAAAAAADKa2Su6/EXRrsmOefDSCL3BwBEITO0krAyRbRmLsC3JNeGAAAAAAEMAABEITO0krAyRbRmLsC3JNeGAAAdPAOsAAA=" ChangeKey="CQAAAA==" />
                                                <t:ParentFolderId Id="AAMkAGZmMjA4MmM4LTQyZTYtNGVhMi04ZjNjLTdkMDI4ODM4ZTQ1OQAuAAAAAADKa2Su6/EXRrsmOefDSCL3AQBEITO0krAyRbRmLsC3JNeGAAAAAAEMAAA=" ChangeKey="AQAAAA==" />
                                            </t:ModifiedEvent>
                                            <t:ModifiedEvent>
                                                <t:TimeStamp>2017-07-28T12:07:39Z</t:TimeStamp>
                                                <t:FolderId Id="AAMkAGZmMjA4MmM4LTQyZTYtNGVhMi04ZjNjLTdkMDI4ODM4ZTQ1OQAuAAAAAADKa2Su6/EXRrsmOefDSCL3AQBEITO0krAyRbRmLsC3JNeGAAAAAAEMAAA=" ChangeKey="AQAAAA==" />
                                                <t:ParentFolderId Id="AAMkAGZmMjA4MmM4LTQyZTYtNGVhMi04ZjNjLTdkMDI4ODM4ZTQ1OQAuAAAAAADKa2Su6/EXRrsmOefDSCL3AQBEITO0krAyRbRmLsC3JNeGAAAAAAEIAAA=" ChangeKey="AQAAAA==" />
                                                <t:UnreadCount>0</t:UnreadCount>
                                            </t:ModifiedEvent>
                                        </m:Notification>
                                    </m:Notifications>
                                </m:GetStreamingEventsResponseMessage>
                            </m:ResponseMessages>
                        </m:GetStreamingEventsResponse>
                    </soap11:Body>
                </Envelope>
                <Envelope
                    xmlns="http://schemas.xmlsoap.org/soap/envelope/">
                    <soap11:Header
                        xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/">
                        <ServerVersionInfo
                            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" MajorVersion="15" MinorVersion="1" MajorBuildNumber="1282" MinorBuildNumber="22" Version="V2017_04_14"
                            xmlns="http://schemas.microsoft.com/exchange/services/2006/types" />
                        </soap11:Header>
                        <soap11:Body
                            xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/">
                            <m:GetStreamingEventsResponse
                                xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                                xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
                                xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages">
                                <m:ResponseMessages>
                                    <m:GetStreamingEventsResponseMessage ResponseClass="Success">
                                        <m:ResponseCode>NoError</m:ResponseCode>
                                        <m:ConnectionStatus>Closed</m:ConnectionStatus>
                                    </m:GetStreamingEventsResponseMessage>
                                </m:ResponseMessages>
                            </m:GetStreamingEventsResponse>
                        </soap11:Body>
                    </Envelope>

Solution

  • "GetStreamingEvents" responses really are streamed.

    This means that the http connection stays open, and the notifications are sent through it in more of a continuous flow than a standard request/response mechanism. This is similar to the way streaming a video works. You don't do a single request for the entire video. Instead, you would read the streamed data from the video as it is being sent, and process it accordingly.

    You need to handle responses to "GetStreamingEvents" in a similar fashion.

    The details provided in the question don't show how you are handling the responses, but I'm guessing that you are using an API that simply fetches a URL and returns a response. That works great for standard requests like the "StreamingSubscriptionRequest", but it won't work for streamed responses.

    APIs that simply fetch a url won't return until a complete response is received and/or the connection is closed. That's why it seems like you're not receiving the streamed events until the timeout expires.

    In fact, you are receiving those events, you're just not reading them and processing them as they come in.

    To do that, you'll need to use an API that allows to you connect to an http server and read from that connection as the data arrives. For iOS, this is as simple as implementing the [connection didReceiveData:] delegate method on NSURLConnection. Presumably, there is some similar higher-level mechanism that can be used in your environment.