使用c#缩短URL

本文关键字:URL 缩短 使用 | 更新日期: 2023-09-27 18:16:55

我想缩短url(例如http://www.abc.com/products/bag.aspx)到类似(http://short.me/bag)的东西。我发现规则可以添加到web中。配置检测短链接以打开正确的页面。但我需要一个动态的web.config。保持网络更新是个好主意吗?配置当用户创建短url?还是有更好的方法?

我试过YOURLS, RewriteRule等。所有似乎都不能在我的服务器上正常工作。我使用的是WIN服务器。我真的不想使用比特API,因为我想有我自己的域名在前面的链接。或者是否有一种方法可以使用bitly API并且仍然保留我的域名?

谢谢。

使用c#缩短URL

您需要创建一个将短url映射到长url的数据库。

然后创建一个HTTP处理程序,查找该数据库中的短URL并重定向到相应的长URL。
然后,注册该处理程序以对所有请求运行。

位。ly现在让你使用自定义域名:https://bitly.com/pro/products,查看他们的FAQ

我用下面的方法实现了我自己的短链接生成程序:

  1. 我准备了一个数据库来存储短链接和相应的原始链接之间的映射关系。
  2. 我创建了一个作为请求处理程序的项目,从数据库中读取以找到原始链接,然后重定向到原始链接(例如,我的域是s.thutool.com)。我已经把这个项目公开发布在:https://github.com/lelelethu/WebToolShortLink.

创建链路映射的功能如下:

public Task HandleUrl(HttpContext context)
{
    if (context.Request.Path == "/")
    {
        //context.Response.Redirect(HomeLink.BasedLink);
        return context.Response.SendFileAsync("wwwroot/index.htm");
    }
    //Get link gốc
    var path = context.Request.Path.ToUriComponent().Trim('/');
    
    List<ShortLinkGetByShortLink> rsShortLinkGetByShortLink = new ShortLinkGetByShortLink(_appSetting).ShortLinkGetByShortLinkDAO(path);
    if (rsShortLinkGetByShortLink != null && rsShortLinkGetByShortLink.Count > 0 && !string.IsNullOrEmpty(rsShortLinkGetByShortLink[0].OriginalLink))
    {
            //Tang count len 1
            ShortLinkUpCountIN shortLinkUpCountIN = new ShortLinkUpCountIN
            {
                ShortLink = rsShortLinkGetByShortLink[0].ShortLink
            };
            new ShortLinkUpCount(_appSetting).ShortLinkUpCountDAO(shortLinkUpCountIN);
            context.Response.Redirect(rsShortLinkGetByShortLink[0].OriginalLink);
        }
        else
        {
            //redirect not found page
            context.Response.Redirect(HomeLink.BasedLink);
        }
        return Task.CompletedTask;
    }

配置端点:

var host = Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(builder =>
{
    builder.ConfigureServices(services =>
    {
        services.AddRouting();
        services.AddTransient<IAppSetting, AppSetting>();
        services.AddTransient<ShortLinkHandleUrl>();
    })
    .Configure(app =>
    {
        app.UseRouting();
        app.UseEndpoints(async (endpoints) =>
        {
            endpoints.MapFallback(context =>
            {
                var appSetting = context.RequestServices.GetRequiredService<IAppSetting>();
                var shortLinkHandleUrl = new ShortLinkHandleUrl(appSetting);
                return shortLinkHandleUrl.HandleUrl(context);
            });
        });
    });
})
.Build();
  • 创建一个API项目来创建短链接。创建短链接的API如下:
        [HttpPost]
        [Route("ShortenLink")]
        [AllowAnonymous]
        public async Task<ActionResult<object>> ShortenLink(ShortenLinkReq shortenLinkReq)
        {
            try
            {
                if (shortenLinkReq == null || string.IsNullOrEmpty(shortenLinkReq.Url))
                {
                    return new Models.Results.ResultApi { Success = ResultCode.ERROR, Message = MessageInfo.Url_InputEmpty };
                }
                if (!Uri.TryCreate(shortenLinkReq.Url, UriKind.Absolute, out Uri result))
                {
                    return new Models.Results.ResultApi { Success = ResultCode.ERROR, Message = MessageInfo.Url_IncorrectUrlFormat };
                }
                //Check if DB has current url or not
                List<ShortLinkGetByOriginalLink> rsShortLinkGetByOriginalLinkDAO = await new ShortLinkGetByOriginalLink(_appSetting).ShortLinkGetByOriginalLinkDAO(shortenLinkReq.Url);
                if (rsShortLinkGetByOriginalLinkDAO != null && rsShortLinkGetByOriginalLinkDAO.Count > 0 && !string.IsNullOrEmpty(rsShortLinkGetByOriginalLinkDAO[0].OriginalLink))
                {
                    return new Models.Results.ResultApi { Success = ResultCode.OK, Result = ShortLinkConst.BasedLink + rsShortLinkGetByOriginalLinkDAO[0].ShortLink };
                }
                else
                {
                    //Get MaxId
                    List<ShortLinkGetMaxId> rsShortLinkGetMaxId = await new ShortLinkGetMaxId(_appSetting).ShortLinkGetMaxIdDAO();
                    ShortLinkInsertIN shortLinkInsert = new ShortLinkInsertIN
                    {
                        ShortLink = $"{FuncWeb.GetUrlChunk(rsShortLinkGetMaxId[0].MaxId.Value + 1)}",
                        OriginalLink = shortenLinkReq.Url,
                        ClickedCount = 0,
                        CreatedDate = DateTime.Now,
                    };
                    await new ShortLinkInsert(_appSetting).ShortLinkInsertDAO(shortLinkInsert);
                    return new Models.Results.ResultApi { Success = ResultCode.OK, Result = ShortLinkConst.BasedLink + shortLinkInsert.ShortLink };
                }
            }
            catch (Exception e)
            {
                return new Models.Results.ResultApi { Success = ResultCode.ERROR, Message = e.Message };
            }
        }
        
        public static string GetUrlChunk(int Id)
        {
            return WebEncoders.Base64UrlEncode(BitConverter.GetBytes(Id)).ToLowerInvariant();
        }
    

    我制作的Webtool: https://thutool.com/en/shortLink。希望通过这种方式,您也可以创建自己的短链接程序。