C# URL Shorter for TinyUrl or bit.ly

Das Socialmedia Publisher Projekt wurde in der zwischenzeit um eine Anbindung an einen URL Shorter Dienst erweitert. Damit man für die unterschiedlichen Socialmedia Plattformen (Twitter, Facebook, etc.) möglichst flexible bleibt, wurde bei der Implementierung das auch in DotNetNuke sehr oft verwendete Provider Pattern verwendet. Der Vorteil dabei ist, dass erst zur Ausführungszeit entschieden wird, welche konkrete Implementierung verwendet wird. Somit ist es also möglich für Facebook z.B. TinyURL zu verwenden und bei Twitter bit.ly.

Die dafür benötigte abstracte Klasse sieht so aus:

   public abstract class URLShorterProvider
    {

        #region [ Shared/Static Methods ]

        private static URLShorterProvider _urlShorterProvider = null;

        public static URLShorterProvider Instance(string typeName)
        {

            URLShorterProvider urlShorterProvider = null;
            CacheManager uscProviderCache = null;
            try
            {
                uscProviderCache = CacheFactory.GetCacheManager
("URLShorterProviderCache"); } catch { } if (uscProviderCache != null) urlShorterProvider = (URLShorterProvider)uscProviderCache
.GetData ("USC" + typeName); if (urlShorterProvider == null) { urlShorterProvider = (URLShorterProvider)TC.Framework.
ProviderPattern.ProviderBase.InitInstance(typeName); if (uscProviderCache != null) uscProviderCache.Add("USC" + typeName, urlShorterProvider,
CacheItemPriority.High, null, new NeverExpired()); } return urlShorterProvider; } #endregion #region [ abstract methods ] public abstract string ShortUrl(string url); #endregion
    }


Genutzt wird hier das singelton Pattern in Kombination mit einem Caching.

Die eigentliche Implementierung für TinyURL ist sehr einfach gehalten und sieht wie folgt aus:

    public class TinyURL : URLShorterProvider
    {
        ///Die maximale Länge der URL, bevor diese gekürtzt wird.
        private const int MAX_URL_LENGTH = 26;
        
        public override string ShortUrl(string url)
        {
            try
            {
                if (url.Length < MAX_URL_LENGTH)
                    return url;

                return new System.Net.WebClient().DownloadString
("http://tinyurl.com/api-create.php?url=" +
System.Web.HttpUtility.UrlEncode(url)); } catch(Exception exc) { Diagnostics.ExceptionHelper.HandleException(exc); return ""; } } }

Mit dieser Methode kann man nun sehr einfach und ohne großen Aufwand neue URLShoter-Dienste anbinden und per Konfiguration diese Dienste dann zuordnen.

Kommentar schreiben