EagleML Web Service - Synchronous Request
Synchronous requests are usually used for data of small volume. To make a synchronous, request prepare a synchronous RunTaskRequest message and call the RunTaskRequestSync method.
The following GenerateSyncRunTaskRequest method should be added:
//create sync runtaskrequest message for making SMF extract     private static eagleSvc.WSRunTaskRequest GenerateSyncRunTaskRequest()     {       //create WSRunTaskRequest object       var runTaskRequest = new eagleSvc.WSRunTaskRequest();       //create RunTaskRequest object       var eagleML = new eagleSvc.RunTaskRequest();       //create header section       var header = new eagleSvc.RequestMessageHeader();       //set messageId       header.messageId = new eagleSvc.MessageId { Value = "ID:SYNCSMFEXTRACT01" };       //set sendBy       header.sentBy = new eagleSvc.MessageAddress { Value = "user" };       //set sendTo , sendTo must be http://www.eagleinvsys.com/eagle_ml-2-0_default_cm_control_message       header.sendTo = new eagleSvc.MessageAddress[1] { new eagleSvc.MessageAddress { Value = "http://www.eagleinvsys.com/eagle_ml-2-0_default_cm_control_message" } };       //set timestamp       header.creationTimestamp = DateTime.Now;       eagleML.header = header;       //create taskidentifier section       var taskIdentifier = new eagleSvc.TaskIdentifier();       //set correlationId, must be unique       taskIdentifier.correlationId = new eagleSvc.CorrelationId { correlationIdScheme = "correlationIdScheme", Value = GenerateUID() };       //set businessTaskId       taskIdentifier.businessTaskId = new eagleSvc.CorrelationId { correlationIdScheme = "businessTaskIdScheme", Value = "SYNC_SMFIST_EXTRACT" };       eagleML.taskIdentifier = taskIdentifier;       //set TaskTypeEnum       eagleML.taskTypeEnum = eagleSvc.TaskTypeEnum.LOAD;       //create and set task parameters       var taskParameters = new eagleSvc.TaskParameter[4];       taskParameters[0] = new eagleSvc.TaskParameter { name = "ActionType", dataType = eagleSvc.DataTypeEnum.S, value = "EXTRACT" };       taskParameters[1] = new eagleSvc.TaskParameter { name = "StreamName", dataType = eagleSvc.DataTypeEnum.S, value = "eagle_ml-2-0_default_out_q" };       taskParameters[2] = new eagleSvc.TaskParameter { name = "FeedType", dataType = eagleSvc.DataTypeEnum.S, value = "SMFEXTRACT" };       taskParameters[3] = new eagleSvc.TaskParameter { name = "fromdate", dataType = eagleSvc.DataTypeEnum.S, value = "2014-12-04 18-00-00" };       eagleML.taskParameters = taskParameters;       //set sync field to yes       eagleML.synchronousExecution = "yes";       runTaskRequest.EagleML = eagleML;       return runTaskRequest;     }
This method matches the method for an asynchronous request, only one parameter is added:
//set sync field to yes       eagleML.synchronousExecution = "yes";
The synchronousExecution field should be set to Yes to make a synchronous request.
Next, perform an EagleML call:
eagleSvc.WSTaskStatusResponse resExtract = myClient.RunTaskRequestSync(runTaskRequest);
The result of execution is a WS TaskStatusResponse object:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:eag="http://www.eagleinvsys.com/2011/wsdl/EagleML-2-0" xmlns:eag1="http://www.eagleinvsys.com/2011/EagleML-2-0"> <soapenv:Header/> <soapenv:Body> <eag:taskStatusResponse> <EagleML eaglemlVersion="2-0"  eaglemlType="TaskStatusResponse" xsi:type="eag1:TaskStatusResponse" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <eag1:header> <eag1:messageId>B50CLF84H5QQYATH</eag1:messageId> <eag1:inReplyTo></eag1:inReplyTo> <eag1:sentBy>http://www.eagleinvsys.com/</eag1:sentBy> </eag1:header> <eag1:statusItem> <eag1:taskIdentifier> <eag1:correlationId correlationIdScheme="correlationIdScheme">797A9631BA32792A</eag1:correlationId> </eag1:taskIdentifier> <eag1:status>SUCCESS</eag1:status> <eag1:reason> <eag1:reasonCode></eag1:reasonCode> <eag1:description></eag1:description> <eag1:additionalData> <eag1:string><![CDATA[<EagleML  eaglemlVersion="2-0"  eaglemlType="ReferenceTransactionMessage"  eaglemlRevision="185"  xsi:schemaLocation="http://www.eagleinvsys.com/2011/EagleML-2-0 eagleml-main-2-0.xsd"  xsi:type="ReferenceTransactionMessage"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns="http://www.eagleinvsys.com/2011/EagleML-2-0"> <header> <messageId>B50CLF84HESQFXNH</messageId> <sentBy>http://www.eagleinvsys.com/</sentBy> <creationTimestamp>2015-01-22T14:28:47-05:00</creationTimestamp> </header> <referenceTransaction> <header> <objectType>GenericSMF</objectType> </header> <genericSMF> <objectType>GenericSMF</objectType> <objectId>SMF</objectId> <objectDescription>SMF</objectDescription> ….. </genericSMF> </referenceTransaction> </EagleML> ]]></eag1:string> </eag1:additionalData ><eag1:workflowState> <eag1:processCorrelationId correlationIdScheme="correlationIdScheme">797A9631BA32792A</eag1:processCorrelationId> </eag1:workflowState> </eag1:reason> </eag1:statusItem> </EagleML> </eag:taskStatusResponse> </soapenv:Body> </soapenv:Envelope>
EagleML GenericSMF document is put under the EaglML/statusItem/reason/additionalData/string element as raw text.
To deserialize raw text to object we should create a getExtractObject method.
//declare serializer for reuse   private static XmlSerializer serializer; //get SMF Generic EagleML object     private static object getExtractObject(eagleSvc.WSTaskStatusResponse res) {       //get raw data of extract from TSR       if (res != null && res.EagleML != null && res.EagleML.statusItem != null && res.EagleML.statusItem.Length > 0)       {         if (res.EagleML.statusItem[0] != null && res.EagleML.statusItem[0].reason != null && res.EagleML.statusItem[0].reason.Length > 0)         {           eagleSvc.Reason reason = res.EagleML.statusItem[0].reason[0];             if (reason != null && reason.additionalData != null && reason.additionalData.Length > 0 && reason.additionalData[0] != null)             {               string data = reason.additionalData[0].Item as string;                             if (serializer == null)               {                 XmlAttributes attrs = new XmlAttributes();                 // Creates an XmlElementAttribute instance to override the                 // field that returns ReferenceObject object. The overridden field                 // returns Expanded object instead.                 XmlElementAttribute attr = new XmlElementAttribute();                 attr.ElementName = "genericSMF";                 attr.Type = typeof(eagleSvc.GenericSMF);                 // Adds the element to the collection of elements.                 attrs.XmlElements.Add(attr);                 // Creates the XmlAttributeOverrides instance.                 XmlAttributeOverrides attrOverrides = new XmlAttributeOverrides();                 // Adds the type of the class that contains the overridden                 // member, as well as the XmlAttributes instance to override it                 // with, to the XmlAttributeOverrides.                 attrOverrides.Add(typeof(eagleSvc.ReferenceTransaction), "ReferenceBaseObject", attrs);                 //*/                 // create serializer with some overrides including root tag rename(new XmlRootAttribute("EagleML"))                 serializer = new XmlSerializer(typeof(eagleSvc.EagleDocument), attrOverrides, null, new XmlRootAttribute("EagleML"), "http://www.eagleinvsys.com/2011/EagleML-2-0");               }               TextReader sr = new StringReader(data);               //deserialize extract string to ReferenceTransactionMessage object               object refTrMess = serializer.Deserialize(sr);               return refTrMess;             }                   }       }       return null;     }
At first we get raw text and then we prepare an xmlSerializer, set necessary properties and overrides and execute the Deserialize method to create a SMF Generic EagleML document object.