C# 尝试创建多个唯一的短URL
我想创建一个post方法,当给定一个包含多个JSON URL的主体时,该方法返回一个缩短的URL列表 这是我的发帖方法:C# 尝试创建多个唯一的短URL,c#,
servicestack,C#,
servicestack,我想创建一个post方法,当给定一个包含多个JSON URL的主体时,该方法返回一个缩短的URL列表 这是我的发帖方法: public class MyServices : Service { public object Post(CreateShortUrlRequest request) //Post an array/list of URLs to the database and get a respective list of short URL { u
public class MyServices : Service
{
public object Post(CreateShortUrlRequest request) //Post an array/list of URLs to the database and get a respective list of short URL
{
using (Task4URLEntities db = new Task4URLEntities())
{
var urls = new List<string>();
foreach (string LongUrl in request.LongUrl)
{
var item = new ShortURLs
{
LongUrl = LongUrl,
ShortUrl = GetUrl(),
DateCreated = DateTime.Now
};
urls.Add($"http://localhost/{item.ShortUrl}");
db.ShortURLs.Add(item);
}
var campaign = new Campaign
{
CampaignName = request.CampaignName,
Enddate = request.Enddate,
Startdate = request.Startdate
};
db.Campaign.Add(campaign);
try
{
db.SaveChanges();
}
catch (DbEntityValidationException ex)
{
foreach (var entityValidationErrors in ex.EntityValidationErrors)
{
foreach (var validationError in entityValidationErrors.ValidationErrors)
{
Response.WriteAsync("Property: " + validationError.PropertyName + " Error: " + validationError.ErrorMessage);
}
}
}
return new CreateShortUrlResponse
{
Response = urls,
CampaignId = campaign.CampaignId
};
}
}
public string GetUrl()
{
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
var stringChars = new char[5];
var random = new Random();
for (int i = 0; i < stringChars.Length; i++)
{
stringChars[i] = chars[random.Next(chars.Length)];
}
var finalString = new String(stringChars);
return finalString;
}
}
公共类MyServices:Service
{
public object Post(CreateShortUrlRequest)//向数据库发布一个数组/URL列表,并获取相应的短URL列表
{
使用(Task4URLEntities db=new Task4URLEntities())
{
var url=新列表();
foreach(request.LongUrl中的字符串LongUrl)
{
var item=新的短URL
{
LongUrl=LongUrl,
ShortUrl=GetUrl(),
DateCreated=DateTime.Now
};
URL.Add($)http://localhost/{item.ShortUrl}”);
db.shortURL.Add(项);
}
var活动=新活动
{
campaigname=request.campaigname,
Enddate=请求。Enddate,
Startdate=request.Startdate
};
db.Campaign.Add(活动);
尝试
{
db.SaveChanges();
}
捕获(DbEntityValidationException ex)
{
foreach(ex.entityValidationErrors中的var entityValidationErrors)
{
foreach(entityValidationErrors.ValidationErrors中的var validationError)
{
WriteAsync(“属性:+validationError.PropertyName+”错误:+validationError.ErrorMessage);
}
}
}
返回新的CreateShortUrlResponse
{
响应=URL,
活动ID=活动。活动ID
};
}
}
公共字符串GetUrl()
{
var chars=“abcdefghijklmnopqrstuvxyzabefghijklmnopqrstuvxyz012456789”;
var stringChars=新字符[5];
var random=新的random();
for(int i=0;i
我的问题是,当我在邮递员上发送关于JSON URL列表的post请求时,如果我再次单击send,我将获得唯一URL作为第一篇帖子的响应,然后我将得到一个响应,其中每个返回的短URL都是相同的
如何更正此问题?我猜当您说“每个返回的短URL都是相同的”时,您的意思是
CreateShortUrlResponse.Response
属性包含完全相同的URLn
次数,其中n
是您请求的URL数量。基于这种行为,我还假设这是一个.NET框架项目,而不是.NET核心项目
如果是这种情况,那么问题是在这样一个紧密循环中创建Random
的新实例会导致创建的每个实例都具有完全相同的种子值。在.NET Framework中使用空构造函数创建Random
的实例时,它使用Environment.TickCount
作为种子。因此,如果您快速连续创建两个Random
实例,它们将具有相同的种子,因此生成相同的值
这个
在.NET Framework上,在紧循环中或快速连续初始化两个随机数生成器将创建两个随机数生成器,它们可以生成相同的随机数序列。在大多数情况下,这不是开发人员的意图,可能会导致性能问题,因为实例化和初始化随机数生成器是一个相对昂贵的过程
为了提高性能并避免无意中创建单独的随机数生成器以生成相同的数字序列,我们建议您创建一个随机对象以随时间生成多个随机数,而不是创建新的随机对象以生成一个随机数
但是,Random类不是线程安全的。如果从多个线程调用随机方法,请遵循下一节讨论的指导原则
因此,您可以使随机
实例成为MyServices
类的成员,而不是每次调用GetUrl
时都创建一个新实例
public class MyServices : Service
{
public object Post(CreateShortUrlRequest request) //Post an array/list of URLs to the database and get a respective list of short URL
{
using (Task4URLEntities db = new Task4URLEntities())
{
var urls = new List<string>();
foreach (string LongUrl in request.LongUrl)
{
var item = new ShortURLs
{
LongUrl = LongUrl,
ShortUrl = GetUrl(),
DateCreated = DateTime.Now
};
urls.Add($"http://localhost/{item.ShortUrl}");
db.ShortURLs.Add(item);
}
var campaign = new Campaign
{
CampaignName = request.CampaignName,
Enddate = request.Enddate,
Startdate = request.Startdate
};
db.Campaign.Add(campaign);
try
{
db.SaveChanges();
}
catch (DbEntityValidationException ex)
{
foreach (var entityValidationErrors in ex.EntityValidationErrors)
{
foreach (var validationError in entityValidationErrors.ValidationErrors)
{
Response.WriteAsync("Property: " + validationError.PropertyName + " Error: " + validationError.ErrorMessage);
}
}
}
return new CreateShortUrlResponse
{
Response = urls,
CampaignId = campaign.CampaignId
};
}
}
public string GetUrl()
{
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
var stringChars = new char[5];
for (int i = 0; i < stringChars.Length; i++)
{
stringChars[i] = chars[_rng.Next(chars.Length)];
}
var finalString = new String(stringChars);
return finalString;
}
private Random _rng = new Random();
}
公共类MyServices:Service
{
public object Post(CreateShortUrlRequest)//向数据库发布一个数组/URL列表,并获取相应的短URL列表
{
使用(Task4URLEntities db=new Task4URLEntities())
{
var url=新列表();
foreach(request.LongUrl中的字符串LongUrl)
{
var item=新的短URL
{
LongUrl=LongUrl,
ShortUrl=GetUrl(),
DateCreated=DateTime.Now
};
URL.Add($)http://localhost/{item.ShortUrl}”);
db.shortURL.Add(项);
}
var活动=新活动
{
campaigname=request.campaigname,
Enddate=请求。Enddate,
Startdate=request.Startdate
};
db.Campaign.Add(活动);
尝试
{
db.SaveChanges();
}
捕获(DbEntityValidationException ex)
{
foreach(ex.entityValidationErrors中的var entityValidationErrors)
{
foreach(entityValidationErrors.ValidationErrors中的var validationError)
{
WriteAsync(“属性:+validationError.PropertyName+”错误:+validationError.ErrorMessage);
}
}
}
返回新的CreateShortUrlResp