4

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

我可能没有对 async 和 await 进行最佳或适当的使用,但我想知道如何从继承的 Validation 类的重写 IsValid 方法中调用我的 async 方法。

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

非常感谢,丹。

4

2 回答 2

3

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

于 2013-09-09T23:35:57.250 回答
2

我无法对此进行全面测试,但您应该可以执行以下操作:

public bool IsValid(object value)
{
    var appCount = GetApplicationRefCountAsync().Result;
    return appCount > 0;
}

public async Task<int> GetApplicationRefCountAsync()
{
    var client = new HttpClient();

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

    return await client.GetStringAsync("api/dataapplications")
        .ContinueWith(r => Convert.ToInt32(r))
        .ConfigureAwait(false);
}

在 ASP.NET 线程中使用 async/await 方法时要小心。很容易造成死锁。

于 2013-09-09T22:03:15.053 回答