Reputation: 660
I'm having a serious issue with EWS managed API and though I published an issue on github for this project, I didn't received any feedback and this is why I really hope that here is someone who can point me in the right direction (last week I had another issue with EWS and thanks to this wonderful community, that issue had been solved).
Now about my issue: as I already told you, I'm using EWS managed API to find some messages using a simple query. On a test environment with only few items / mailbox, the search is working perfectly but when I put it in production I'm getting quite a strange issue (exception):
[ServiceXmlDeserializationException: An element node 't:Mailbox' of the type Element was expected, but node 't:SearchScope' of type Element was found.]
Microsoft.Exchange.WebServices.Data.EwsXmlReader.InternalReadElement(XmlNamespace xmlNamespace, String localName, XmlNodeType nodeType) +451
Microsoft.Exchange.WebServices.Data.SearchMailboxesResult.LoadFromXml(EwsServiceXmlReader reader) +464
Microsoft.Exchange.WebServices.Data.SearchMailboxesResponse.ReadElementsFromXml(EwsServiceXmlReader reader) +47
Microsoft.Exchange.WebServices.Data.ServiceResponse.LoadFromXml(EwsServiceXmlReader reader, String xmlElementName) +360
Microsoft.Exchange.WebServices.Data.SearchMailboxesRequest.ParseResponse(EwsServiceXmlReader reader) +230
Microsoft.Exchange.WebServices.Data.ServiceRequestBase.ReadResponse(EwsServiceXmlReader ewsXmlReader) +157
Microsoft.Exchange.WebServices.Data.SimpleServiceRequestBase.ReadResponseXml(Stream responseStream) +87
Microsoft.Exchange.WebServices.Data.SimpleServiceRequestBase.ReadResponse(IEwsHttpWebResponse response) +403
Microsoft.Exchange.WebServices.Data.MultiResponseServiceRequest`1.Execute() +53
XXX.XXX.MailManager.Admin.Controllers.MailingManagerController.Search(MailingManagerMasterModel masterModel) +722
lambda_method(Closure , ControllerBase , Object[] ) +139
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +209
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +35
System.Web.Mvc.Async.AsyncControllerActionInvoker.<BeginInvokeSynchronousActionMethod>b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState) +39
System.Web.Mvc.Async.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult) +67
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +42
System.Web.Mvc.Async.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d() +72
System.Web.Mvc.Async.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() +386
System.Web.Mvc.Async.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() +386
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +42
System.Web.Mvc.Async.<>c__DisplayClass2b.<BeginInvokeAction>b__1c() +30
System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult) +186
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +38
System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +29
System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +65
System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +53
System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +36
System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +38
System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__5(IAsyncResult asyncResult, ProcessRequestState innerState) +44
System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +65
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +38
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +399
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +137
The code for doing the search is the following:
List<MailboxSearchScope> mailboxSearchScopes = new List<MailboxSearchScope>();
foreach (SearchableMailbox mailbox in response.SearchableMailboxes)
{
mailboxSearchScopes.Add(new MailboxSearchScope(mailbox.ReferenceId, MailboxSearchLocation.All));
}
SearchMailboxesParameters searchMailboxesParameters = new SearchMailboxesParameters();
List<MailboxQuery> queries = new List<MailboxQuery>()
{
new MailboxQuery(String.Format("Body:{0} OR Subject:{0}", masterModel.FilteringOptions.Subject), mailboxSearchScopes.ToArray())
};
searchMailboxesParameters.SearchQueries = queries.ToArray();
searchMailboxesParameters.PerformDeduplication = false;
searchMailboxesParameters.ResultType = SearchResultType.PreviewOnly;
ServiceResponseCollection<SearchMailboxesResponse> responseCollection = service.SearchMailboxes(searchMailboxesParameters);
Where do you think is the issue?
Thank you very much for your help.
Upvotes: 0
Views: 1299
Reputation: 660
So, thanks to the suggestion given by Glen, I was able to fix the issue - I enabled tracing and I logged all the requests and responses to an xml file and this way I found the bug.
Long story short - somehow (don't ask why because I have no idea) during the enumeration of the searchable mailboxes to be put as MailboxSearchScope, I discovered that some of them had the ReferenceId an empty string and from here, the generated request was invalid.
So, what I did was pretty simple:
foreach (SearchableMailbox mailbox in response.SearchableMailboxes)
{
if (String.IsNullOrEmpty(mailbox.ReferenceId))
continue;
mailboxSearchScopes.Add(new MailboxSearchScope(mailbox.ReferenceId, MailboxSearchLocation.All));
}
Upvotes: 0
Reputation: 22032
I would suggest you enabling tracing https://msdn.microsoft.com/en-us/library/office/dd633676(v=exchg.80).aspx and dump out the request your making to the server. Eg it maybe something in your request causing the failure a correctly formatted request should look something like the following example. In the error your getting its indicating that Mailbox element of the MailboxSearchScope is missing (eg your not including any mailboxes to search for). A trace dump (or fiddler capture) will verify this.
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version="Exchange2013_SP1" />
</soap:Header>
<soap:Body>
<m:SearchMailboxes>
<m:SearchQueries>
<t:MailboxQuery>
<t:Query>Subject:test</t:Query>
<t:MailboxSearchScopes>
<t:MailboxSearchScope>
<t:Mailbox>/o=ExchangeLabs/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=a29159c5bd8e4f7ab9127r</t:Mailbox>
<t:SearchScope>PrimaryOnly</t:SearchScope>
<t:ExtendedAttributes />
</t:MailboxSearchScope>
</t:MailboxSearchScopes>
</t:MailboxQuery>
</m:SearchQueries>
<m:ResultType>PreviewOnly</m:ResultType>
<m:Deduplication>false</m:Deduplication>
<m:PageSize>1000</m:PageSize>
<m:PageDirection>Next</m:PageDirection>
</m:SearchMailboxes>
</soap:Body>
</soap:Envelope>
Upvotes: 1