c#-4.0 - 在 MVC4 中尝试使用 Async、Task 和 Await 异步的 ValidationAttribute

标签 c#-4.0 asp.net-mvc-4 asynchronous asp.net-web-api async-await

我正在尝试在 MVC4 中编写一个验证属性。
目的是检查应用程序引用是否存在(只是一个表示我希望防止重复的键的字符串)。
我的数据是通过 WebAPI 访问的,因为我使用的是 4.5,所以如果可能的话,我希望使其异步。

我可能没有充分或适本地使用 async 和 await,但我想知道如何从继承的 Validation 类的重写 IsValid 方法调用我的异步方法。

public class UniqueApplicationReferenceAttribute : ValidationAttribute
{
    public UniqueApplicationReferenceAttribute() : base(() => "The {0} already exists") { }

    public int? ApplicationCount { get; set; }

    public override bool IsValid(object value)
    {
        var myTask = GetApplicationRefCountAsync();

        myTask.Wait();

        this.ApplicationCount = this.ApplicationCount ?? 0;

        if (ApplicationCount > 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }


    public async Task GetApplicationRefCountAsync()
    {
        HttpClient client = new HttpClient();

        client.BaseAddress = new Uri("http://localhost:11111/");
        client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

        var apps = client.GetStringAsync("api/dataapplications");

        await Task.WhenAll(apps);

        var appList = apps.Result;

        this.ApplicationCount =  appList.Count();// apps.Count();
    }
}

非常感谢,
担。

最佳答案

我建议您同步调用 WebAPI 方法。 ValidationAttribute本身不支持异步实现,因此您将编写的任何同步超异步代码都只是一种黑客行为,与同步版本相比,实际上并没有提供任何好处。

关于c#-4.0 - 在 MVC4 中尝试使用 Async、Task 和 Await 异步的 ValidationAttribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18707228/

相关文章:

c# - 如何在不产生内存分配开销的情况下暂停/恢复异步工作线程?

javascript - 如果 Promise 尚未结算,那么 then 之后的代码如何运行?

.net - 带有动态参数的 ChannelFactory 错误

c#-4.0 - Dataset/datatable是值类型还是引用类型

javascript - 如何将 JSON 数据传递给代码隐藏方法(而不是 Webmethod)?

asp.net-mvc - MVC - 无法解析 View (不同项目中的 Controller 和 View )

asp.net-mvc-4 - 如何在 ASP.NET MVC 中使用 for 循环?

asp.net-mvc-4 - 将 Url.RouteUrl() 与区域中的路线名称一起使用

C# 不同对象列表的通用方法

从客户端套接字读取时的C#AsyncSockets递归