相关疑难解决方法(0)

Xamarin HttpClient 请求超时

在 Xamarin.Forms 应用程序中,我尝试连接到 Exosites api(它不是项目的一部分,因此我无法更改 SignalR 左右的那个)。

对于“正常”请求,这一切都很好。

api 还支持长轮询请求 - 在手册中它说客户端必须为请求设置标头“Request-Timeout”。

var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, requestUri);
request.Headers.Add("Request-Timeout", "10000");
var response = await client.SendAsync(request);
Run Code Online (Sandbox Code Playgroud)

但是这样做,我没有得到任何答复,即使我将超时设置为非常小的值,例如 1 (ms)。如果我对 Exosites 上的另一个端点的请求设置超时,但它没有检查它,它工作正常。发送没有“Request-Timeout”标头的完全相同的请求也可以正常工作。

有没有人有使用 HttpClient 在 Xamarin 中进行长轮询调用的经验?

非常感谢!

切格

c# xamarin xamarin.forms

2
推荐指数
1
解决办法
8952
查看次数

等待异步方法在后台做什么?

我已经发布了关于异步等待的各种文章,我试图理解等待异步的深度.我的问题是,我发现等待异步方法不会创建一个新线程,而只是让UI响应.如果它是这样的,那么在使用等待异步时没有时间增益,因为没有使用额外的线程.

到目前为止我所知道的是只有Task.Run()创建一个新线程.对于Task.WhenAll()或Task.WhenAny(),这也是如此吗?

假设我们有这个代码:

    async Task<int> AccessTheWebAsync()
            {
                using (HttpClient client = new HttpClient())
                {
                    Task<string> getStringTask = client.GetStringAsync("https://docs.microsoft.com");

                    DoIndependentWork();

                    string urlContents = await getStringTask;

                    return urlContents.Length;
                }
            }
Run Code Online (Sandbox Code Playgroud)

我期待的是:

  1. 创建getStringTask任务时,另一个线程将复制当前上下文并开始执行GetStringAsync方法.

  2. 在等待getStringTask时,我们将看到其他线程是否已完成其任务,如果不是,则控件将返回AccessTheWebAsync()方法的调用者,直到另一个线程完成其恢复控制的任务为止.

所以我真的不知道在等待任务时如何创建额外的线程.有人可以解释在等待任务时究竟发生了什么吗?

c# asynchronous threadpool async-await

2
推荐指数
1
解决办法
381
查看次数

我应该在HttpClient中使用Using语句吗?

我正在创建一个API,充当应用程序和其他2个API之间的桥梁。我想知道最好的方法是什么。我正在使用HttpClient。该应用程序有近一千个用户。

我阅读了这篇文章https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/。我真的不应该使用using语句吗?我也在做同步api调用。这有什么作用吗?我做的效率高吗?

这是我的代码:

[HttpGet]
[Route("api/apiname")]     
public String GetNumberofP([FromUri]GetNumberofPRequest getNPRequest){          

    var request = JsonConvert.SerializeObject(getNPRequest);
    string errorMessage = "";           

    try{              
         httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.gettoken());

         var response = httpClient.GetAsync("api/MobileApp/GetNumberP?"
                      + "strCardNumber=" + getNPRequest.strCardNumber
                     + "&strDateOfBirth=" + getNPRequest.strDateOfBirth).Result;
         return response;
    }            
    catch (Exception e){                
        throw utils.ReturnException("GetNumberofP", e, errorMessage);           
    }      
}
Run Code Online (Sandbox Code Playgroud)

.net c# httpclient asp.net-web-api asp.net-core

2
推荐指数
1
解决办法
611
查看次数

在PCL中与HttpClient进行异步调用

我有一个PCl,我想在其中使用HttpClient进行异步调用.我编码像这样

 public static async Task<string> GetRequest(string url)
    {            
        var httpClient = new HttpClient() { MaxResponseContentBufferSize = int.MaxValue };
        HttpResponseMessage response = await httpClient.GetAsync(url);
        return response.Content.ReadAsStringAsync().Result;
    }
Run Code Online (Sandbox Code Playgroud)

但等待显示错误"无法等待System.net.http.httpresponsemessage"之类的消息.

如果我使用这样的代码比一切顺利但不是异步方式

public static string GetRequest(string url)
    {
        var httpClient = new HttpClient() { MaxResponseContentBufferSize = int.MaxValue };
        HttpResponseMessage response = httpClient.GetAsync(url).Result;
        return response.Content.ReadAsStringAsync().Result;
    }
Run Code Online (Sandbox Code Playgroud)

我只是希望这个方法以异步方式执行.

这是屏幕截图:

在此输入图像描述

c# asynchronous portable-class-library dotnet-httpclient

1
推荐指数
1
解决办法
1986
查看次数