private static XmlDocument GetResponse(string soapXmlPacket, string action, Action<object> asyncCallback)
{
bool isAsync = (asyncCallback != null);
string xml = getSoapEnvelope(soapXmlPacket);
string msg = null;
XmlHttpRequest xmlHttpRequest = new XmlHttpRequest();
xmlHttpRequest.Open("POST", GetServerUrl() + "/XRMServices/2011/Organization.svc/web", isAsync);
xmlHttpRequest.SetRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/" + action);
xmlHttpRequest.SetRequestHeader("Content-Type", "text/xml; charset=utf-8");
// This is only needed when debugging via localhost - and accessing the CRM webservices cross domain in chrome
if (WithCredentials)
{
Script.Literal("{0}.withCredentials = true;", xmlHttpRequest);
}
if (isAsync)
{
xmlHttpRequest.OnReadyStateChange = delegate()
{
if (xmlHttpRequest == null)
return;
if (xmlHttpRequest.ReadyState == ReadyState.Loaded)
{
// Capture the result
XmlDocument resultXml = xmlHttpRequest.ResponseXml;
string errorMsg = null;
if (xmlHttpRequest.Status != 200)
{
errorMsg = GetSoapFault(resultXml);
}
// Tidy Up
Script.Literal("delete {0}", xmlHttpRequest);
xmlHttpRequest = null;
if (errorMsg != null)
{
asyncCallback(errorMsg);
}
else
{
// Callback
asyncCallback(resultXml);
}
}
};
xmlHttpRequest.Send(xml);
return null;
}
else
{
xmlHttpRequest.Send(xml);
// Capture the result
XmlDocument resultXml = xmlHttpRequest.ResponseXml;
// Check for errors.
if (xmlHttpRequest.Status != 200)
{
msg = GetSoapFault(resultXml);
}
// Tidy Up
Script.Literal("delete {0};", xmlHttpRequest);
xmlHttpRequest = null;
if (msg != null)
{
throw new Exception("CRM SDK Call returned error: '" + msg + "'");
}
else
{
// Return
return resultXml;
}
}
}