gpt4 book ai didi

c# - 在异步 Controller 中使用同步操作

转载 作者:太空宇宙 更新时间:2023-11-03 13:32:13 25 4
gpt4 key购买 nike

我使用的是 VS 2013 以及 4.5.1 框架和 MVC5。

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

这是我在后端 Web 服务上进行异步和同步操作的代码。

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

同步 public void AddCategory(类别猫) { 尝试 { 使用 (YeagerTechEntities DbContext = new YeagerTechEntities()) {

                    Category category = new Category();

category.Description = cat.Description;

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

这是我 Controller 中前端的代码。

异步

 [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”生成方法 stub

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

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

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

我需要做什么才能解决这个问题?

最佳答案

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

关于c# - 在异步 Controller 中使用同步操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20102163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com