2013-11-20 5 views
2

Я использую 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); 

Что мне нужно сделать, чтобы решить эту проблему?

+2

Любой шанс на все есть два 'классы category' ходят PS - это на самом деле полезно' поймать (Exception) {забросить} ' –

+0

методы в модели проекта пространства имен:«YeagerTechModel?. Категория ". При возврате из службы, чтобы получить данные, мне нужно указать следующий код:" YeagerTechWcfService.Category [] categ oryList = wait db.GetCategoriesAsync(); «Если я попытаюсь использовать этот код» YeagerTechModel.Category [] = await db.GetCategoriesAsync(); », я получаю сообщение об ошибке: Невозможно неявно преобразовать тип« YeagerTech.YeagerTechWcfService.Category []] 'to' YeagerTechModel.Category [] '. Если вы заметили, я указал, что прокси-сервер сгенерировал вышеуказанный код сообщений, в котором хранятся данные. Есть идеи? – sagesky36

+0

Часто, если два класса находятся в одной иерархии и могут быть преобразованы один в другой 1 за раз, массивы не могут быть преобразованы так автоматически. Примечание. 2 класса с одинаковым именем в одной иерархии просто плохие и неправильные, поэтому в этом случае они не должны * быть *. –

ответ

1

Попробуйте изменить AsyncController на Controller. AsyncController больше не требуется.

+0

Я внес изменения, как было предложено. Тем не менее, я получаю msg: наилучшее перегруженное соответствие метода для 'YeagerTech.YeagerTechWcfService.YeagerTechWcfServiceClient.AddCategory (YeagerTech.YeagerTechWcfService.Category)' имеет некоторые недопустимые аргументы. – sagesky36

0

Решено, изменив параметр, входящий в метод.

До этого он был типа: «YeagerTechModel.Category». Я изменил его на «YeagerTechWcdfService».. Категория»(который прокси генерироваться) и решил время разработки ошибка компиляции

Благодаря вам обоим, указывая мне в правильном направлении :)

Вот код, который я обновил его:

?
[HttpPost] 
     [Authorize(Roles = "Admin, AdminStage")] 
     public ActionResult UpsertCategory([DataSourceRequest]DataSourceRequest request, YeagerTechWcfService.Category cat, Boolean blnInsert) 
     { 
      if (TryUpdateModel(cat)) 
      { 
       try 
       { 
        if (blnInsert) 
         db.AddCategory(cat); 
        else 
         db.EditCategory(cat); 

        return Json(new[] { cat }.ToDataSourceResult(request, ModelState)); 
       } 
Смежные вопросы