public static void Main()
var testJoinUri = new Uri(string.Format("https://skype.com/l/meetup-join/{0}/{1}?context={2}", HttpUtility.UrlEncode("19:add0de565477445fa128412161704bc8@thread.skype"), 0, "{\"tid\":\"abc\",\"oid\":\"def\"}"));
Console.WriteLine(testJoinUri.ToString());
var testEncodedUri = HttpUtility.UrlEncode(testJoinUri.ToString());
var notDouble = HttpUtility.UrlEncode(HttpUtility.UrlDecode(testJoinUri.ToString()));
Console.WriteLine(testEncodedUri);
var joinUrl = @"https%3A%2F%2Fdevspaces.skype.com%2Fl%2Fmeetup-join%2F19%3Ameeting_NDhiZmVjZjMtZTMzMi00NjIxLWIwMzgtMGIyYjdmMDQ1YzYw%40thread.v2%2F0%3Fcontext%3D%7B%22Tid%22%3A%2272f988bf-86f1-41af-91ab-2d7cd011db47%22%2C%22Oid%22%3A%227213b700-dbba-4841-9ecf-05c74b20f973%22%7D";
joinUrl = testEncodedUri;
var joinUri = new Uri(HttpUtility.UrlDecode(joinUrl));
var absolutePathComponents = joinUri.AbsolutePath.Split('/');
var qsCollection = HttpUtility.ParseQueryString(joinUri.Query);
var contextValue = qsCollection["context"];
var meetingContext = JsonConvert.DeserializeObject<MeetingContext>(contextValue);
var tenantId = meetingContext.Tid;
var objectId = meetingContext.Oid;
var threadId = absolutePathComponents[3];
var messageId = absolutePathComponents[4];
var additionalMessageId = meetingContext.MessageId;
Console.WriteLine(tenantId);
Console.WriteLine(objectId);
Console.WriteLine(threadId);
Console.WriteLine(messageId);
Console.WriteLine(additionalMessageId);
public class MeetingContext {
public string Tid {get;set;}
public string Oid {get;set;}
public string MessageId {get;set;}