C# Xamarin Http请求只能在iOS模拟器上工作

C# Xamarin Http请求只能在iOS模拟器上工作,c#,android,ios,xamarin.forms,system.net.httpwebrequest,C#,Android,Ios,Xamarin.forms,System.net.httpwebrequest,我正在使用system.net.http为我的应用程序构建一个web服务层。我开始在iphone模拟器上构建它(我首先为iOS开发),一切正常。我签入了我的代码,然后开始在其他设备上测试,但什么都不起作用。。。我在物理iOS设备和android物理/模拟器上也遇到了同样的异常 我得到的错误是:发送请求时出错 下面是我用来发出请求的代码。如果我跟随带有断点的代码,那么它将在这一行失败: var response=wait client.SendAsync(请求) 公共类ApiService:IAp

我正在使用
system.net.http
为我的应用程序构建一个web服务层。我开始在iphone模拟器上构建它(我首先为iOS开发),一切正常。我签入了我的代码,然后开始在其他设备上测试,但什么都不起作用。。。我在物理iOS设备和android物理/模拟器上也遇到了同样的异常

我得到的错误是:
发送请求时出错

下面是我用来发出请求的代码。如果我跟随带有断点的代码,那么它将在这一行失败:
var response=wait client.SendAsync(请求)

公共类ApiService:IApiService
{
HttpClient;
公共列表组{get;private set;}
公共服务()
{
client=新的HttpClient();
client.MaxResponseContentBufferSize=256000;
}
公共异步任务GetGroupsForuser(int userId)
{
组=新列表();
//获取http://{server}/groupcontrol/api/group/user/{userId}
var requestString=string.Format(“{0}/{1}/{2}/{3}/{4}/{5}”,Constants.BaseUrl,Constants.kcontrolroll,Constants.kEndpointAPI,Constants.kEndpointOot,Constants.kEndpointUser,userId);
var requestUri=新Uri(string.Format(requestString,string.Empty));
//集合方法
var methodName=“GET”;
var httpMethod=newhttpmethod(methodName.ToUpper());
//创建请求
var request=newhttprequestmessage(httpMethod,requestUri);
//设置标题
添加(“接受”、“应用程序/x-www-form-urlencoded”);
添加(“授权”,新授权().getAuthToken());
WriteLine(string.Format(“打印出完整的请求:{0}”,请求));
尝试
{
var response=wait client.SendAsync(请求);//client.SendAsync(requestMessage);
if(响应IsSuccessStatusCode)
{
var content=await response.content.ReadAsStringAsync();
Groups=JsonConvert.DeserializeObject(内容);
}否则{
WriteLine(string.Format(“{0}”,response.StatusCode));
}
}
捕获(例外情况除外)
{
Debug.WriteLine(“>>>错误-----------------{0}”,例如Message);
}
返回组;
}
}
如前所述,代码可以在iOS模拟器上运行,但不能在物理设备上运行(这很奇怪)。我已经更新了info.plist以使用任意加载,所以这不应该是一个问题。我所说的API也在本机生产iOS应用程序中使用(我也在与
nsursession
)因此API不是问题,这是xamarin的问题。我还授予Android应用程序
互联网
权限


有人有过这方面的经验吗?这非常令人沮丧,我不知道如何进一步调试它

所以我将失败的请求从
try
块中取出,以便进一步调试。我发现问题与证书签名有关&我用来与应用程序通话的地址

第一件事第一个Android不喜欢一个真实的地址,需要一个IP(谢谢大家)。禁用证书检查所需的第二件事是,我使用以下代码执行此操作:

System.Net.ServicePointManager.ServerCertificateValidationCallback +=
(sender, cert, chain, sslPolicyErrors) =>
{
    if (cert != null) System.Diagnostics.Debug.WriteLine(cert);
    return true;
};
我把它放在我的请求之前,现在它可以在所有设备上工作。沙马林又来了!:D

public异步任务CallLoginApiAsync(登录)
{
client=新的HttpClient();
client.MaxResponseContentBufferSize=256000;
var json=JsonConvert.serialized对象(登录名,Newtonsoft.json.Formatting.Indented);
var content=newstringcontent(json,Encoding.UTF8,“application/json”);
var uri=Utils.WebConstants.LOGINURL;
int tryCount=0;
试试{

while(tryCount)您是否为Android添加了权限?@volkanshin45是
System.Net.ServicePointManager.ServerCertificateValidationCallback +=
(sender, cert, chain, sslPolicyErrors) =>
{
    if (cert != null) System.Diagnostics.Debug.WriteLine(cert);
    return true;
};
public async Task<string> CallLoginApiAsync(Login login)
{

    client = new HttpClient();
    client.MaxResponseContentBufferSize = 256000;



    var json = JsonConvert.SerializeObject(login, Newtonsoft.Json.Formatting.Indented);


    var content = new StringContent(json, Encoding.UTF8, "application/json");

    var uri = Utils.WebConstants.LOGINURL;
    int tryCount = 0;
    try { 
    while (tryCount <= maxtry)
    {
        var result = await client.PostAsync(uri, content);


        if (result.IsSuccessStatusCode)
        {
            string resultString = await result.Content.ReadAsStringAsync();

            return resultString;


        }
        else
        {
            if (tryCount == maxtry)
            {
                return Utils.AppConstants.ERROR;
            }
            else
            {
                tryCount++;
            }


        }

    }
}
    catch (Exception e)
    {
        return Utils.AppConstants.ERROR;
    }

    return Utils.AppConstants.ERROR;

}