异步Web Api操作过早返回

时间:2017-05-12 15:33:15

标签: c# mongodb asp.net-web-api async-await restsharp

我正在编写一个将使用我编写的REST API的nuget包。我在使用RestSharp异步调用它时遇到了一些困难。

我有以下控制器方法:

    [HttpGet("{id}")]
    public async Task<IActionResult> GetFeatureByIdAsync(string id)
    {
        if (string.IsNullOrWhiteSpace(id))
        {
            ModelState.AddModelError("id-Null", "The id parameter cannot be null.");
            return BadRequest(ModelState);
        }

        var feature = await _director.GetFeatureById(id);

        if (feature == null)
            return NotFound();

        var model = new ViewModel<Feature>(feature);
        return Ok(model);
    }

我在单独的解决方案中有以下类库:

    public async Task<bool> IsSwitchEnabledAsync(string name)
    {
        string fullyFormedUrl = $"{_url}/{name}";

        var client = new RestClient(fullyFormedUrl) { Encoding = Encoding.UTF8 };

        var request = new RestRequest(Method.GET) { RequestFormat = DataFormat.Json };

        var result = await client.ExecuteTaskAsync<FeatureViewModel>(request);

        var message = $"Response: {result.StatusCode}, {result.ResponseStatus}, " +
                          $"\n\nError: {result.ErrorException}, {result.ErrorMessage} " +
                          $"\n\nData: {result.Content}";
        Debug.WriteLine(message);

        return result.Data != null;
    }

我有以下基本集成测试沙箱:

[TestFixture]
public class Sandbox
{
    private FeatureSwitch _sut;

    [OneTimeSetUp]
    public void Setup()
    {
        const string machineName = "localhost";
        const int port = 5000;
        _sut = new FeatureSwitch(machineName, port);
    }

    [Test]
    public async Task ShouldReturnTrue()
    {
        var result = await _sut.IsSwitchEnabledAsync("Release_US501_AddUser");
        result.Should().BeTrue();
    }
}

我正在寻找关于如何正确调用API的最佳方法的一点教育?由于我的沙盒代码因内部服务器500错误而失败。这是因为api方法正在等待嵌套的异步调用完成。因此,在嵌套的api调用有机会完成之前,初始请求将返回到沙盒代码。

沙箱测试代码需要等待API返回结果。目前它没有这样做。

那么这里的正确方法是什么?

更新: 我的问题归咎于Mongo库方法的错误使用。

1 个答案:

答案 0 :(得分:0)

我的问题来自对Mongo库方法的.chained方法调用:

我试图做以下事情:

Collection.Find(x => x.Name.ToLower().Equals(name.ToLower())

编译的代码,但它抛出了VS工作室17没有破坏的例外,所以我不知道问题发生在哪里。打开代码镜头后,我注意到失败的请求以红色突出显示。这打开了一个App Insights窗口,其中突出显示已抛出的4 InvalidOperationException()的细分。这就是我如何发现内部服务器错误500的内容。

无论如何,我是如何解决异步Web API问题的 - 这是我第一次在Web服务上使用它,所以我不知道预期的默认行为应该是什么。