private void OnEnd(object exception, object thisObj, object returnValue)
{
try
{
if (thisObj == null)
{
DependencyCollectorEventSource.Log.NotExpectedCallback(0, "OnBeginHttp", "thisObj == null");
return;
}
DependencyCollectorEventSource.Log.EndCallbackCalled(thisObj.GetHashCode().ToString(CultureInfo.InvariantCulture));
Tuple<DependencyTelemetry, bool> telemetryTuple = this.TelemetryTable.Get(thisObj);
if (telemetryTuple == null)
{
DependencyCollectorEventSource.Log.EndCallbackWithNoBegin(thisObj.GetHashCode().ToString(CultureInfo.InvariantCulture));
return;
}
if (telemetryTuple.Item1 == null)
{
DependencyCollectorEventSource.Log.EndCallbackWithNoBegin(thisObj.GetHashCode().ToString(CultureInfo.InvariantCulture));
return;
}
// Not custom created
if (!telemetryTuple.Item2)
{
this.TelemetryTable.Remove(thisObj);
DependencyTelemetry telemetry = telemetryTuple.Item1;
int statusCode = -1;
var responseObj = returnValue as HttpWebResponse;
if (responseObj == null && exception != null)
{
var webException = exception as WebException;
if (webException != null)
{
responseObj = webException.Response as HttpWebResponse;
}
#if !NET40
if (responseObj == null)
{
var httpException = exception as HttpException;
if (httpException != null)
{
statusCode = httpException.GetHttpCode();
}
}
#endif
}
if (responseObj != null)
{
try
{
statusCode = (int)responseObj.StatusCode;
if (responseObj.Headers != null)
{
var targetIkeyHash = responseObj.Headers[RequestResponseHeaders.TargetInstrumentationKeyHeader];
if (!string.IsNullOrEmpty(targetIkeyHash))
{
telemetry.Type = RemoteDependencyConstants.AI;
telemetry.Target += " | " + targetIkeyHash;
}
}
}
catch (ObjectDisposedException)
{
// ObjectDisposedException is expected here in the following sequence: httpWebRequest.GetResponse().Dispose() -> httpWebRequest.GetResponse()
// on the second call to GetResponse() we cannot determine the statusCode.
}
}
telemetry.ResultCode = statusCode > 0 ? statusCode.ToString(CultureInfo.InvariantCulture) : string.Empty;
telemetry.Success = (statusCode > 0) && (statusCode < 400);
ClientServerDependencyTracker.EndTracking(this.telemetryClient, telemetry);
}
}
catch (Exception ex)
{
DependencyCollectorEventSource.Log.CallbackError(thisObj == null ? 0 : thisObj.GetHashCode(), "OnBeginHttp", ex);
}
}