Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# HttpClient如何在一个位置捕获每个响应_C#_Xamarin_Xamarin.forms_Httpclient_Dotnet Httpclient - Fatal编程技术网

C# HttpClient如何在一个位置捕获每个响应

C# HttpClient如何在一个位置捕获每个响应,c#,xamarin,xamarin.forms,httpclient,dotnet-httpclient,C#,Xamarin,Xamarin.forms,Httpclient,Dotnet Httpclient,我正在开发Xamarin.Forms应用程序,它与WebAPI2API连接,所有请求和响应都与HttClient一起工作。这是我的代码: 为我的所有请求和HttpClient的定义初始化 public class DataStore : IDataStore<object> { HttpClient client; public DataStore() { client = new HttpClie

我正在开发Xamarin.Forms应用程序,它与WebAPI2API连接,所有请求和响应都与HttClient一起工作。这是我的代码:

为我的所有请求和HttpClient的定义初始化

  public class DataStore : IDataStore<object>
    {
        HttpClient client;

        public DataStore()
        {
            client = new HttpClient()
            {
                BaseAddress = new Uri($"{App.Uri}")
            };

        }
我的一个请求的示例:

   public async Task<User> GetProfileSetup()
        {
            try
            {
                if (CrossConnectivity.Current.IsConnected)
                {
                    string token = DependencyService.Get<ISharedFunctions>().GetAccessToken();

                    client.DefaultRequestHeaders.Clear();
                    client.DefaultRequestHeaders.Add("Accept", "application/json");
                    client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);

                    var response = await client.GetAsync(@"api/User/GetProfilSetup");
                    if (response.IsSuccessStatusCode)
                    {
                        string jsonMessage;
                        using (Stream responseStream = await response.Content.ReadAsStreamAsync())
                        {
                            jsonMessage = new StreamReader(responseStream).ReadToEnd();
                        }
                        User user = JsonConvert.DeserializeObject<User>(jsonMessage);


                        return user;
                    }
                    else
                    {
                        var m = response.Content.ToString();
                        return null;
                    }

                }
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
                string error = ex.Message;
                return null;

            }
        }

我的想法是在一个地方检查每个响应状态代码。我需要这个用于抛出警报错误、刷新令牌等。有没有可能的方法?我想控制每个请求/响应。

这与xamarin无关,这是OOP中的抽象问题。您可以而且应该抽象HttpClient及其方法以删除所有样板文件

示例-GetAsyncurl将检查连接,forms请求添加必要的头,等待响应,检查响应状态,读取响应,最后返回反序列化响应。这样,如果您想添加缓存层,就更容易了。基本面向对象

抽象代码:

公共异步任务GetAsyncstring url { 尝试 { 如果!CrossConnectivity.Current.IsConnected { //抛出自定义异常? 新的非网络例外; } var token=DependencyService.Get.GetAccessToken; client.DefaultRequestHeaders.Clear; client.DefaultRequestHeaders.AddAccept,application/json; client.DefaultRequestHeaders.AddAuthorization,承载+令牌; var response=await client.GetAsyncurl; if!response.issucessStatusCode { //读取响应并抛出日志? new InvaidResponseException;//自定义异常使捕获更容易 } 使用Stream responseStream=wait response.Content.ReadAsStreamAsync { //也应该有一个异步重载来读取 var jsonMessage=new StreamReaderresponseStream.ReadToEnd; 返回JsonConvert.DeserializeObjectjsonMessage; } } catchNoNetworkException ex { //处理 } Catch InvaidResponseException ex { //处理 } }
如果有人对此有问题,只需要实现自定义处理程序,谁将继承表单DelegatingHandler。我的代码示例:

  public class StatusCodeHandler : DelegatingHandler
    {
        public StatusCodeHandler(HttpMessageHandler innerHandler) : base(innerHandler) { }
        public GetStatusCode GetStatusCode = new GetStatusCode();
        protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            HttpResponseMessage response = null;
                response = await base.SendAsync(request, cancellationToken);
                if (response.IsSuccessStatusCode)
                {
                    return response;
                }
            else
            { 
                var status_code = (int)response.StatusCode;
                GetStatusCode.GetResponseCode(status_code);
            }
            return response;
        }

     }

我知道它不是xamarin,它是HttpClient的基础,但我不想在每个异步任务中检查响应状态并复制代码。上面的代码应该位于DataStore类中,并且应该在所有http调用中使用DataStore的单例对象。如果你想在一个地方做ui动作,比如烤面包。。。您应该在BaseViewModel中创建方法,并在每次捕获ViewModel时调用它。您有一些示例吗?您的意思是在每个AsyncTask中调用GetAsync?