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# Xamarin表单、HttpClient类-GetStringAsync和GetAsync返回空值并快速退出函数_C#_Xamarin_Httpclient_System.net.httpwebrequest - Fatal编程技术网

C# Xamarin表单、HttpClient类-GetStringAsync和GetAsync返回空值并快速退出函数

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

当我运行代码时,在调用GetStringAsync或GetAsync的函数中,这两个调用返回空值并立即从函数中退出(之后的所有代码都未访问)

我制作了一个可以从web浏览器访问的web api,也可以在emulator浏览器()中访问,然后我尝试制作一个xamarin表单,以管理与它的通信

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;
    }

}