gSOAP EWS:ErrorInvalidIdEmpty错误

时间:2015-09-22 14:52:12

标签: c++ xml deserialization exchangewebservices gsoap

我想将从FindItemResponse收到的ItemID传递给GetItemRequest,以便从Exchange邮箱获取邮件。

EWS托管API(针对C#,。Net)中有一个Bind方法,用于传递该ItemID,但我正在使用C ++和Exchange Web服务(SOAP)。

我的客户代码是:

    /*FindItem RESPONSE*/

if( proxy->FindItem(findItem, findItemRes) == SOAP_OK){
    std::string* messgID = NULL;

    ns1__MessageType* messgT = new ns1__MessageType();
    messgT->ItemId = new ns1__ItemIdType();
    messgID = &messgT->ItemId->Id;

    ns1__ArrayOfRealItemsType* realItems = new ns1__ArrayOfRealItemsType();
    realItems->__union_ArrayOfRealItemsType = new __ns1__union_ArrayOfRealItemsType();
    messgT = realItems->__union_ArrayOfRealItemsType->union_ArrayOfRealItemsType.Message;

    ews__FindItemResponseMessageType *firsm = new ews__FindItemResponseMessageType();
    firsm->RootFolder = new ns1__FindItemParentType();
    firsm->RootFolder->__union_FindItemParentType = 1;
    realItems = firsm->RootFolder->union_FindItemParentType.Items;

    findItemRes.ews__FindItemResponse = new ews__FindItemResponseType();
    findItemRes.ews__FindItemResponse->ResponseMessages = new ews__ArrayOfResponseMessagesType();
    findItemRes.ews__FindItemResponse->ResponseMessages->__union_ArrayOfResponseMessagesType = new __ews__union_ArrayOfResponseMessagesType();
    findItemRes.ews__FindItemResponse->ResponseMessages->__union_ArrayOfResponseMessagesType->__union_ArrayOfResponseMessagesType = 2;
    firsm = findItemRes.ews__FindItemResponse->ResponseMessages->__union_ArrayOfResponseMessagesType->union_ArrayOfResponseMessagesType.FindItemResponseMessage;


    /*GetItem REQUEST*/
        ews__GetItemType* getItem = new ews__GetItemType();
        getItem->ItemShape = new ns1__ItemResponseShapeType();
        getItem->ItemShape->BaseShape = ns1__DefaultShapeNamesType__IdOnly;


        //get the ItemId from FindItem
        ns1__ItemIdType* ItmID = new ns1__ItemIdType();
        ItmID->Id = messgT[0].ItemId->Id; /*Set the itemID of the desired item to retrieve from FindItem*/

        getItem->ItemIds = new ns1__NonEmptyArrayOfBaseItemIdsType();
        getItem->ItemIds->__size_NonEmptyArrayOfBaseItemIdsType = 1;
        getItem->ItemIds->__union_NonEmptyArrayOfBaseItemIdsType = new __ns1__union_NonEmptyArrayOfBaseItemIdsType();
        getItem->ItemIds->__union_NonEmptyArrayOfBaseItemIdsType->__union_NonEmptyArrayOfBaseItemIdsType = 2;
        getItem->ItemIds->__union_NonEmptyArrayOfBaseItemIdsType->union_NonEmptyArrayOfBaseItemIdsType.ItemId = ItmID;

}

但是此代码会在评论Segmentation fault上提供/*Set the itemID of the desired item to retrieve from FindItem*/,但是当我删除该代码ItmID->Id = messgT[0].ItemId->Id;时,它就会成功运行。

所以我想知道是否有一种方法可以通过代码从findItem Response XML中提取itemId,以便在getItem请求中传递该id,以便对该数据进行加密,因为EWS中没有Bind方法(SOAP) 。因为在findItem Response消息中 我的itemID如下

<m:FindItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" 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">
<m:ResponseMessages>
    <m:FindItemResponseMessage ResponseClass="Success">
        <m:ResponseCode>NoError</m:ResponseCode>
        <m:RootFolder TotalItemsInView="2" IncludesLastItemInRange="true">
            <t:Items>
                <t:Message>
                    <t:ItemId Id="edAQAfAGNvZGV1aWJAY29kZXVpYi5vb" ChangeKey="CQAAABAAAAAWl"/>
                </t:Message>
                <t:Message>
                    <t:ItemId Id="tNFedAQAfAGNvZGV1aWJAYHYIO88OUA" ChangeKey="CQAAAAAAWT"/>
                </t:Message>
            </t:Items>
        </m:RootFolder>
    </m:FindItemResponseMessage>
</m:ResponseMessages>

但如何从这里提取itemId?  任何的想法?谢谢。

更新

当我手动传递ItemID时,如下所示

ns1__ItemIdType* ItmID = new ns1__ItemIdType();
/*Set the itemID of the desired item to retrieve from FindItem*/
ItmID[0].Id = "edAQAfAGNvZGV1aWJAY29kZXVpYi5vb";

然后,findItem响应给出200(OK)http状态,而getItem请求给出401 Unauthorized。有关我的更多信息,我也发布了该查询Here

请帮助解决此问题。非常感谢。

已解决UPDATE问题。在“答案”部分中部分解决了细分错误,但发生了ErrorInvalidIdEmpty错误,请将我的答案视为问题。

1 个答案:

答案 0 :(得分:0)

不知怎的,我已经通过将messgID作为字符串

跟踪代码更改来解决此问题
std::string messgID;
ns1__MessageType* messgT = new ns1__MessageType();
messgT->ItemId = new ns1__ItemIdType();
messgID = messgT->ItemId->Id;

并将其直接分配给getItem请求标识

//get the ItemId from FindItem
ns1__ItemIdType* ItmID = new ns1__ItemIdType();
ItmID->Id = messgID; 

但现在问题是Id为空(ErrorInvalidIdEmpty),这意味着Id必须为非空。

所以我认为问题在于FindItem Response对象(XML到C ++的反序列化),现在任何熟悉 gSoap 的人都可以帮我找出这个问题。据我说,可能是以下问题:

  1. 可能是FindItem响应对象(findItemRes)是空的,如果是,那么如何从中获取响应?或者我是否按错误的顺序分配值?
  2. 注意:由于上面给出了findItem响应的XML响应(意味着ItemIds存在)。

    请帮帮我。谢谢。