C# HttpClient如何在一个位置捕获每个响应
我正在开发Xamarin.Forms应用程序,它与WebAPI2API连接,所有请求和响应都与HttClient一起工作。这是我的代码: 为我的所有请求和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
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?