public string GetShortLink(string code)
{
string query = string.Format("shortlinks/{0}", code);
//todo: zamiast query stringa w postaci stringa to lepiej zastosować klasę HttpQueryString
BlipCommunicationState state = BlipCommunicationState.OK;
Exception exp = null;
HttpStatusCode httpCode = HttpStatusCode.OK;
HttpResponseMessage resp = null;
string link = null;
EventWaitHandle waitHandle = new AutoResetEvent(false);
try
{
ThreadPool.QueueUserWorkItem(
c =>
{
//po testach wydaje się że ten lock nie potrzebny
// a może jednak potrzebny -
//todo: zbadać to lepiej
try
{
lock (httpSyncClientLock)
{
resp = blipHttpClientSync.Get(query);
}
}
catch (Exception)
{
//gdy wystąpiły jakieś błędy w komunikacji
}
finally
{
waitHandle.Set();
}
}
);
waitHandle.WaitOne(WebGetTimout);
//sprawdzamy czy komunikacja się powiodła
//todo: trochę to niebezpiecznie, na razie zostawiam
if (resp != null && resp.StatusCode == HttpStatusCode.OK)
{
resp.EnsureStatusIsSuccessful();
var blipLink = resp.Content.ReadAsJsonDataContract<BlipShortLink>();
link = blipLink.OriginalLink;
}
}
catch (ArgumentOutOfRangeException aorEx)
{
state = BlipCommunicationState.CommunicationError;
if (resp != null) httpCode = resp.StatusCode;
//gdy wystąpiły jakieś błędy w komunikacji
}
catch (SerializationException serEx)
{
state = BlipCommunicationState.CommunicationError | BlipCommunicationState.Error;
if (resp != null) httpCode = resp.StatusCode;
exp = serEx;
}
catch (Exception ex)
{
state = BlipCommunicationState.Error;
exp = ex;
}
finally
{
if (resp != null)
{
resp.Dispose();
resp = null;
}
}
if (((state & BlipCommunicationState.CommunicationError) == BlipCommunicationState.CommunicationError)
&& CommunicationError != null)
{
CommunicationError(null, new CommunicationErrorEventArgs(httpCode, BlipActions.AfterGetShortLink));
}
if ((state & BlipCommunicationState.Error) == BlipCommunicationState.Error && ExceptionOccure != null)
{
ExceptionOccure(null, new ExceptionEventArgs(exp));
}
//zwróc link, nie ważcne czy będzie null czy miał ustawioną wartość
return link;
}