在异步控制器中使用同步操作

时间:2013-11-20 17:00:28

标签: c# wcf asynchronous asp.net-mvc-5

我正在使用VS 2013和4.5.1框架以及MVC5。

我有一个Web服务,其中包含从客户端MVC控制器调用的方法。其中大多数是异步的,少数是同步的。 我的客户端控制器中的设计时编译错误是同步的。谁能告诉我为什么?

以下是我的后端Web服务上的异步和同步操作的代码。

public class CategoryController : AsyncController

ASYNC

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;
            }
        }

同步             public void AddCategory(Category cat)             {                 尝试                 {                     使用(YeagerTechEntities DbContext = new YeagerTechEntities())                     {

                    Category category = new Category();

                    category.Description = cat.Description;

                    DbContext.Categories.Add(category);
                    DbContext.SaveChanges();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

以下是我控制器中前端的代码。

ASYNC

 [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;
 }

同步

[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”方法,则会有一个蓝色下划线表示:

在YeagerTech.YeagerTechWcfService.YeagerTechWcfServiceClient中为“AddCategory”生成方法存根“

如果我这样做,它会在我的Reference.cs文件中添加一个内部方法,该方法是在创建时在方法体中添加服务引用时产生的典型“未实现”错误时生成的。但是,我的Reference.cs文件中的AddCategory和EditCategory方法各有两种方法。如果我遵守添加存根的话,就会抱怨该方法已经存在且理所当然。

以下是在代理中生成的两种方法。第一个是同步,第二个是异步:

[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 个答案:

答案 0 :(得分:1)

尝试将AsyncController更改为Controller。不再需要AsyncController

答案 1 :(得分:0)

通过更改进入方法的参数来解决它。

之前,它的类型为:“YeagerTechModel.Category”。我将其更改为“YeagerTechWcdfService.Category”(代理生成)并解决了设计时编译错误。

感谢你们两位指点我正确的方向:)

以下是我将其更新为的代码:

[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));
                }