Я использую VS 2013 с фреймворком 4.5.1 и MVC5.Использование синхронных операций в асинхронном контроллере
У меня есть веб-сервис, который содержит методы, вызываемые с клиентских MVC-контроллеров. Большинство из них асинхронны, а некоторые из них синхронны. Я получаю ошибки компиляции времени проектирования в моих клиентских контроллерах для синхронных. Может ли кто-нибудь сказать мне, почему?
Вот мой код для операции async и синхронизации на моем бэкэнд-сервере.
public class CategoryController : AsyncController
АСИНХРОННОГО
public async Task<Category> GetCategoryIDAsync(Int16 categoryid)
{
try
{
using (YeagerTechEntities DbContext = new YeagerTechEntities())
{
DbContext.Configuration.ProxyCreationEnabled = false;
DbContext.Database.Connection.Open();
var categoryEntity = await DbContext.Categories.Include("Projects").FirstOrDefaultAsync(f => f.CategoryID == categoryid);
Category category = null;
if (categoryEntity != null)
{
category = new Category();
category.CategoryID = categoryEntity.CategoryID;
category.Description = categoryEntity.Description;
category.Projects = categoryEntity.Projects;
}
else
throw new Exception("Category " + categoryid + " not found!");
return category;
}
}
catch (Exception)
{
throw;
}
}
SYNC общественного недействительный AddCategory (Категория кошка) { попробовать { используя (YeagerTechEntities DbContext = новые YeagerTechEntities()) {
Category category = new Category();
category.Description = cat.Description;
DbContext.Categories.Add(category);
DbContext.SaveChanges();
}
}
catch (Exception)
{
throw;
}
}
Вот код на интерфейсе моего контроллера.
АСИНХРОННОГО
[Authorize(Roles = "Admin, AdminStage")]
public async Task<ActionResult> SelectCategoryProjects([DataSourceRequest]DataSourceRequest request, string intCategoryID)
{
if (Session["Culture"] != null)
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(Session["Culture"].ToString());
try
{
YeagerTechWcfService.Project[] projectList = await db.GetProjectByCategoryIDAsync(Convert.ToInt16(intCategoryID));
var serializer = new JavaScriptSerializer();
var result = new ContentResult();
serializer.MaxJsonLength = Int32.MaxValue;
result.Content = serializer.Serialize(projectList.ToDataSourceResult(request));
result.ContentType = "application/json";
return result;
}
SYNC
[HttpPost]
[Authorize(Roles = "Admin, AdminStage")]
public ActionResult UpsertCategory([DataSourceRequest]DataSourceRequest request, Category cat, Boolean blnInsert)
{
if (TryUpdateModel(cat))
{
try
{
if (blnInsert)
db.AddCategory(cat);
else
db.EditCategory(cat);
return Json(new[] { cat }.ToDataSourceResult(request, ModelState));
}
я получаю время дизайна компиляции ошибки типичного «лучший перегруженный матча метода» «Есть некоторые недопустимые аргументы», который легко достаточно, чтобы понять.
Если я нажимаю метод «AddCategory», есть синее подчеркивание, который гласит:
Создавать метод заглушку для «AddCategory» в YeagerTech.YeagerTechWcfService.YeagerTechWcfServiceClient»
Если я что, это добавляет внутренний метод в моем файле Reference.cs, который прокси генерировал при добавлении ссылки на службу с типичной ошибкой «Не реализовано» в теле метода при ее создании. Однако для AddCategory и EditCategory существует уже два метода методы в моем файле Reference.cs.Если я соблюдаю добавление заглушки, он жалуется, что метод уже существует и по праву.
Вот два метода, которые были получены в прокси-сервере. Первая синхронизация и второй один является асинхронным:
[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IYeagerTechWcfService/AddCategory", ReplyAction="http://tempuri.org/IYeagerTechWcfService/AddCategoryResponse")]
void AddCategory(YeagerTech.YeagerTechWcfService.Category cat);
[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IYeagerTechWcfService/AddCategory", ReplyAction="http://tempuri.org/IYeagerTechWcfService/AddCategoryResponse")]
System.Threading.Tasks.Task AddCategoryAsync(YeagerTech.YeagerTechWcfService.Category cat);
Что мне нужно сделать, чтобы решить эту проблему?
Любой шанс на все есть два 'классы category' ходят PS - это на самом деле полезно' поймать (Exception) {забросить} ' –
методы в модели проекта пространства имен:«YeagerTechModel?. Категория ". При возврате из службы, чтобы получить данные, мне нужно указать следующий код:" YeagerTechWcfService.Category [] categ oryList = wait db.GetCategoriesAsync(); «Если я попытаюсь использовать этот код» YeagerTechModel.Category [] = await db.GetCategoriesAsync(); », я получаю сообщение об ошибке: Невозможно неявно преобразовать тип« YeagerTech.YeagerTechWcfService.Category []] 'to' YeagerTechModel.Category [] '. Если вы заметили, я указал, что прокси-сервер сгенерировал вышеуказанный код сообщений, в котором хранятся данные. Есть идеи? – sagesky36
Часто, если два класса находятся в одной иерархии и могут быть преобразованы один в другой 1 за раз, массивы не могут быть преобразованы так автоматически. Примечание. 2 класса с одинаковым именем в одной иерархии просто плохие и неправильные, поэтому в этом случае они не должны * быть *. –