簡體   English   中英

gSOAP EWS:ErrorInvalidIdEmpty錯誤

[英]gSOAP EWS: ErrorInvalidIdEmpty error

我想將我從FindItemResponse收到的ItemID傳遞給GetItemRequest,以從交換郵箱中獲取消息。

EWS托管API中有一個Bind方法(用於C#、. Net),用於傳遞該ItemID,但是我將C ++與Exchange Web Services(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;

}

但是,此代碼在注釋/*Set the itemID of the desired item to retrieve from FindItem*/給出Segmentation fault ,但是當我刪除該代碼時, ItmID->Id = messgT[0].ItemId->Id; 然后它成功運行。

所以我想知道是否有一種方法可以通過代碼從findItem響應XML中提取itemId,以在getItem請求中傳遞該ID來對消息數據進行加注,因為EWS(SOAP)中沒有Bind方法。 由於在findItem響應消息中,我具有如下的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 Request給出401未經授權。 有關此的更多信息,我也在此處發布了該查詢

請幫助解決此問題。 許多人預先表示感謝。

UPDATE問題已解決。 細分錯誤已在“答案”部分得到部分解決,但發生ErrorInvalidIdEmpty錯誤,請參閱“我的答案”為問題。

我以某種方式通過將messgID作為字符串來messgID代碼中的更改,從而部分解決了此問題

std::string messgID;
ns1__MessageType* messgT = new ns1__MessageType();
messgT->ItemId = new ns1__ItemIdType();
messgID = messgT->ItemId->Id;

並將其直接分配給getItem請求ID

//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)為空,如果是,那么如何從中訪問響應? 還是我以錯誤的順序分配值?

注意:由於findItem響應的XML響應(意味着存在ItemIds)如上述XML所示。

請幫我。 謝謝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM