У меня есть предстоящая задача для университета. Целью является разработка API, содержащего системный лог c, который могут использовать веб и android агенты, запрашивая через URL-адреса.
Что мне нужно?
Как указано в заголовке вопроса, мне нужно обновить содержимое представления без необходимости использовать AJAX / JQuery ", что не является обязательным предварительным условием в задаче, но я должен, как крайний срок за углом, следовательно, нет времени, чтобы изучить эти "
Что я пытался?
Я думал об использовании C# Threading объект, то есть «System.Threading.Timer», чтобы вызывать API каждые x секунд для обнаружения изменений и записи в представление.
Все шло хорошо, пока я не попытался записать изменения в представление. Я всегда сталкиваюсь с System.Argument Exception: значение не попадает в ожидаемый диапазон . После некоторого просмотра это исключение вызывается при попытке записи в представление после того, как оно уже загружено. Вот код
User.cs
public class User
{
public int? Id { get; set; }
public String Name { get; set; }
}
_Card.cs html
@model String
<!--dummy card design-->
<span>@Model</span><br>
Index.cs html
@model List<User>
@using Newtonsoft.Json;
//Consider @Model = new List<User>(){new User(1,"User1"),new User(2,"User2")}
@foreach (User user in Model) { @Html.Partial("~/Views/z.Shared/Components/Cards/_Card.cshtml", user.Id + " " + user.Name); }
<div id="newUsers">
@{
int existingUsersCount = Model.Count();
void callable()
{
WebClient wc = new WebClient();
String url = "apiURL";
byte[] response = wc.DownloadData(url);
String encodedResponse = System.Text.Encoding.ASCII.GetString(response);
//Consider encodedResponse = [{"Id":3,"Name":"newUser1"},{"Id":4,"Name":"newUser2"}]
List<User> users = JsonConvert.DeserializeObject<List<User>>(encodedResponse);
int newRecordsCount = users.Count() - existingUsersCount;
if (newRecordsCount > 0)
{
List<User> newUsers = users.Skip(existingUsersCount).ToList();
foreach (User user in newUsers)
{
//Problem is here i cant write the changes to the view
Html.RenderPartial("~/Views/z.Shared/Components/Cards/_Card.cshtml", user.Id + " " + user.Name);
//Exception thrown: 'System.ArgumentException' in System.Web.dll
//An unhandled exception of type 'System.ArgumentException' occurred in System.Web.dll
//Value does not fall within the expected range.
}
existingUsersCount+=newRecordsCount;
}
}
}
</div>
@{
var timer = new System.Threading.Timer((e) => callable(), null, TimeSpan.Zero, TimeSpan.FromSeconds(5));
}
Замечания по коду
- Откуда поток берет свои ресурсы с сервера машина или браузер машина?