Проблема в том, что вы отправляете ответ дважды. Попробуйте, как показано ниже, сработать, если не вернуть меня обратно.
else {
res.status(error.response.status)
Return res.send(error.response.data.problem)
}
Я использовал бы OpenX, DART, Google Ad Manager , RightMedia , Рубикон , или некоторый другой менеджер по рекламе.
Однако, если я хотел создать его сам как осуществление, я был бы:
Это - тот же подход, который Вы использовали бы для отображения циклически повторенной цитаты, случайным образом известного пользователя или любого другого случайного содержания, которое Вы хотите отобразить на каждой странице.
Я не знаю MVC, но есть ли что-нибудь останавливающее Вас использующий управление AdRotator?
http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.adrotator.aspx
Вы могли просто генерировать случайное число и использовать его в качестве ключа массива для объявления, которое Вы хотите отобразить, но Вы не смогли бы гарантировать даже воздействие, и оно вызовет много проблем когда дело доходит до обмена деньгами. Приложение, которое было создано с этой целью, OpenX. Это предоставляет действительно подробно статистику, и она также позволяет Вам устанавливать, насколько каждое объявление должно быть отображенным ect. Ее очень мощное, много коммерческих веб-сайтов используют его для управления их рекламой.
Я должен был записать что-то в MVC для взвешенного управления рекламой, которое не показало ту же рекламу дважды подряд, если возможный и в моей поспешности я закончил с ужасным битом кода, который мог бы служить вдохновением для Вас.
я уверен, что существует много лучших способов сделать это (и я уже знаю случаи, где это пропускает дубликаты, когда это не было должно), но в течение короткого срока я потратил на него, это сделало задание.
public List<Ad> GetRandomWeightedAds()
{
/* Generate random order list of ads with duplicates for ViewsPerRotation */
List<Ad> returnList = GetAllAds().SelectMany(s => Enumerable.Repeat(s, s.ViewsPerRotation)).OrderBy(s => Guid.NewGuid()).ToList();
for (int i = 0; i < returnList.Count - 1; i++) /* Compare all but the last element against subsequent element */
{
if (returnList[i].Id == returnList[i + 1].Id)
{
/* If next to an identical element try and find a new spot for the subsequent element */
for (int j = 0; j < returnList.Count; j++)
{
if (returnList[j].Id != returnList[i].Id /* Don't switch identical element back into same pos*/
&& (j<i || j == 0 || j-1 == i || returnList[i].Id != returnList[j - 1].Id) /* When moving before current 'i', don't move into a place after an identical element */
&& (j<i || j == returnList.Count - 1 || j + 1 == i || returnList[i].Id != returnList[j + 1].Id)) /* When moving before current 'i', don't move into a place before an identical element */
{
returnList[i] = returnList[j];
returnList[j] = returnList[i+1]; /* returnList[i+1] == returnList[i] */
break;
}
}
}
}
return returnList;
}