我正在编写一个将使用我编写的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库方法的错误使用。
答案 0 :(得分:0)
我的问题来自对Mongo库方法的.chained方法调用:
我试图做以下事情:
Collection.Find(x => x.Name.ToLower().Equals(name.ToLower())
编译的代码,但它抛出了VS工作室17没有破坏的例外,所以我不知道问题发生在哪里。打开代码镜头后,我注意到失败的请求以红色突出显示。这打开了一个App Insights窗口,其中突出显示已抛出的4 InvalidOperationException()
的细分。这就是我如何发现内部服务器错误500的内容。
无论如何,我是如何解决异步Web API问题的 - 这是我第一次在Web服务上使用它,所以我不知道预期的默认行为应该是什么。