【问题标题】:Sending PUT request via HttpClient to Saucelabs not responding通过 HttpClient 向 Saucelabs 发送 PUT 请求没有响应
【发布时间】:2017-08-29 22:16:51
【问题描述】:

我正在尝试通过their API 发送PUT 请求以更新Saucelabs 上的作业。但是,以下代码挂起,我不知道为什么。

using (var client = new HttpClient())
{
    var sessionId = Browser.Driver.GetSessionId();
    var uri = new Uri($"https://saucelabs.com/rest/v1/{Configuration.SauceUserName}/jobs/{sessionId}");
    var uriWithCred =
        new UriBuilder(uri)
        {
            UserName = $"{Configuration.SauceUserName}",
            Password = $"{Configuration.SauceAccessKey}"
        }.Uri;
    var payload = new StringContent($"{{\"name\":\"{TestMethodName}\"}}", Encoding.UTF8, "application/json");
    var request = new HttpRequestMessage
    {
        Method = HttpMethod.Put,
        RequestUri = uriWithCred,
        Content = payload
    };
    var response = client.SendAsync(request).Result;                
}

以下 cUrl 请求成功(当然是编辑凭据)。

curl -X PUT -s -u <username>:<access-key> 
-d "{\"name\": \"test name\"}"
https://saucelabs.com/rest/v1/<username>/jobs/<job-id>

为什么这个请求会挂起,我该怎么做才能让它成功?

由于与问题无关的原因,我在设置 WebDriver 的功能时无法设置作业的名称。

【问题讨论】:

  • 假设它一直在等待响应,您是否使用 Fiddler(或任何其他工具)来比较两个请求的标头(您的代码与 cUrl?

标签: c# .net rest selenium-webdriver remotewebdriver


【解决方案1】:

为什么这个请求会挂起,我该怎么做才能让它成功?

很可能在 client.SendAsync 方法上混合了异步调用和阻塞调用,例如 .Result,这可能导致死锁,或者如您所说,导致代码挂起。

考虑使用await 使方法调用一直异步。

public async Task CallAPIAsync() {    
    using (var client = new HttpClient()) {
        var sessionId = Browser.Driver.GetSessionId();
        var uri = new Uri($"https://saucelabs.com/rest/v1/{Configuration.SauceUserName}/jobs/{sessionId}");
        var uriWithCred =
            new UriBuilder(uri) {
                UserName = $"{Configuration.SauceUserName}",
                Password = $"{Configuration.SauceAccessKey}"
            }.Uri;
        var payload = new StringContent($"{{\"name\":\"{TestMethodName}\"}}", Encoding.UTF8, "application/json");
        var request = new HttpRequestMessage {
            Method = HttpMethod.Put,
            RequestUri = uriWithCred,
            Content = payload
        };
        var response = await client.SendAsync(request);

        var content = await response.Content.ReadAsStringAsync();
    }
}

【讨论】:

  • 这对我有用,谢谢!我对 .NET 中的异步机制没有任何实际经验,您有推荐的链接或资源吗?
  • @Muttonchop,这是我开始使用 async/await 的地方。作者是该主题的权威。 msdn.microsoft.com/en-us/magazine/jj991977.aspx
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多