C# Xamarin表单、HttpClient类-GetStringAsync和GetAsync返回空值并快速退出函数
当我运行代码时,在调用GetStringAsync或GetAsync的函数中,这两个调用返回空值并立即从函数中退出(之后的所有代码都未访问) 我制作了一个可以从web浏览器访问的web api,也可以在emulator浏览器()中访问,然后我尝试制作一个xamarin表单,以管理与它的通信C# Xamarin表单、HttpClient类-GetStringAsync和GetAsync返回空值并快速退出函数,c#,xamarin,httpclient,system.net.httpwebrequest,C#,Xamarin,Httpclient,System.net.httpwebrequest,当我运行代码时,在调用GetStringAsync或GetAsync的函数中,这两个调用返回空值并立即从函数中退出(之后的所有代码都未访问) 我制作了一个可以从web浏览器访问的web api,也可以在emulator浏览器()中访问,然后我尝试制作一个xamarin表单,以管理与它的通信 class MainPageViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler Property
class MainPageViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public MainPageViewModel()
{
GetEmployees();
}
private async void GetEmployees()
{
using (var httpClient = new HttpClient())
{
var uri = "http://192.168.1.135:8092/api/Masters/GetEmployees/";
var result = await httpClient.GetStringAsync(uri);
var EmployeeList = JsonConvert.DeserializeObject<List<Employee>>(result);
Employees = new ObservableCollection<Employee>(EmployeeList);
}
}
ObservableCollection<Employee> _employees;
public ObservableCollection<Employee> Employees
{
get
{
return _employees;
}
set
{
_employees = value;
OnPropertyChanged(nameof(Employee));
}
}
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
返回某个值,但实际输出为null,后面的代码未被访问,因为这两个调用立即从函数退出避免混合使用async/Wait和阻塞调用,如.Wait()或.Result 重构代码,使其始终保持异步
public MainPageViewModel()
{
var EmployeeList = GetEmployees();
Employees = new ObservableCollection<Employee>(EmployeeList.Result);
}
private async Task<List<Employee>> GetEmployees()
{
using (var httpClient = CreateClient())
{
var response = await httpClient.GetAsync(ApiBaseAddress).ConfigureAwait(false);
var test = response;
if (response.IsSuccessStatusCode)
{
var json = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
if (!string.IsNullOrWhiteSpace(json))
{
var EmployeeList = JsonConvert.DeserializeObject<List<Employee>>(json);
return EmployeeList;
}
}
return null;
}
}
publicMainPageViewModel()
{
var EmployeeList=GetEmployees();
Employees=新的ObservableCollection(EmployeeList.Result);
}
私有异步任务GetEmployees()
{
使用(var httpClient=CreateClient())
{
var response=await-httpClient.GetAsync(ApiBaseAddress).ConfigureAwait(false);
var测试=响应;
if(响应。IsSuccessStatusCode)
{
var json=await response.Content.ReadAsStringAsync().ConfigureAwait(false);
如果(!string.IsNullOrWhiteSpace(json))
{
var EmployeeList=JsonConvert.DeserializeObject(json);
返回员工名单;
}
}
返回null;
}
}
您是否尝试过使用浏览器访问该url?是的,我已经说过,使用浏览器它可以工作,仅在调用时,不幸的是,无法工作。可能您正在运行的emulator(Android或iOS)无法访问该url,您能启动emulator吗,使用已安装的浏览器并尝试输入该url?请在设备浏览器中尝试该url。使用(var httpClient=CreateClient())是错误的,httpClient应在每个应用程序而不是每次使用时实例化一次。抛出异常:明文HTTP流量到192.168.1.135未经许可检查我已经读过,但对我来说不起作用。我相信我的问题是ssl证书,因为如果我尝试使用https连接到web api,我无法确定您是否尝试更改另一个url?好的,通过将这些代码行添加到AndroidManifest.xml中解决了问题
var response = await httpClient.GetAsync(ApiBaseAddress).ConfigureAwait(false);
public MainPageViewModel()
{
var EmployeeList = GetEmployees();
Employees = new ObservableCollection<Employee>(EmployeeList.Result);
}
private async Task<List<Employee>> GetEmployees()
{
using (var httpClient = CreateClient())
{
var response = await httpClient.GetAsync(ApiBaseAddress).ConfigureAwait(false);
var test = response;
if (response.IsSuccessStatusCode)
{
var json = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
if (!string.IsNullOrWhiteSpace(json))
{
var EmployeeList = JsonConvert.DeserializeObject<List<Employee>>(json);
return EmployeeList;
}
}
return null;
}
}