我正在使用system.net.http
为我的应用构建一个Web服务层。我开始在iphone模拟器上构建它(因为我首先为iOS开发)并且一切正常。我检查了我的代码,然后开始在其他设备上进行测试,没有任何作用...我在物理iOS设备上获得相同的异常& android物理/模拟器。
我得到的错误是:An error occurred while sending the request
以下是我用来发出请求的代码。如果我使用断点跟随代码,那么它将在此行上失败:
var responce = await client.SendAsync(request);
public class ApiService : IApiService
{
HttpClient client;
public List<Group> Groups { get; private set; }
public ApiService()
{
client = new HttpClient();
client.MaxResponseContentBufferSize = 256000;
}
public async Task<List<Group>> GetGroupsForuser(int userId)
{
Groups = new List<Group>();
//GET http://{server}/groupcontrol/api/group/user/{userId}
var requestString = string.Format("{0}/{1}/{2}/{3}/{4}/{5}", Constants.BaseUrl, Constants.kControlURL, Constants.kEndpointAPI, Constants.kEndpointOot, Constants.kEndpointUser, userId);
var requestUri = new Uri(string.Format(requestString, string.Empty));
//Set method
var methodName = "GET";
var httpMethod = new HttpMethod(methodName.ToUpper());
//Create request
var request = new HttpRequestMessage(httpMethod, requestUri);
//Set Headers
request.Headers.Add("Accept", "application/x-www-form-urlencoded");
request.Headers.Add("Authorization", new Authorisation().getAuthToken());
Debug.WriteLine(string.Format("Printing out complete request: {0}", request));
try
{
var responce = await client.SendAsync(request);//client.SendAsync(requestMessage);
if (responce.IsSuccessStatusCode)
{
var content = await responce.Content.ReadAsStringAsync();
Groups = JsonConvert.DeserializeObject<List<Group>>(content);
} else {
Debug.WriteLine(string.Format("{0}",responce.StatusCode));
}
}
catch (Exception ex)
{
Debug.WriteLine(">>>ERROR-------------- {0}", ex.Message);
}
return Groups;
}
}
如前所述,代码适用于iOS模拟器,但不适用于物理设备(很奇怪)。我已经更新了info.plist以使用任意加载,因此不应该是一个问题。我正在谈论的API也在本机生产iOS应用程序中使用(我也与NSURLSession
交谈)因此API不是问题,这是一个xamarin问题。我还给了Android应用Internet
权限。
有没有人有这方面的经验?这非常令人沮丧,我不知道如何进一步调试它!
答案 0 :(得分:1)
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; }
它在android中工作。
答案 1 :(得分:0)
所以我将失败的请求从try
块中取出,以便我可以进一步调试。我发现问题与证书签名有关。我用来与应用交谈的地址。
首先,Android并不像真正的地址那样需要IP(感谢大家)。我需要禁用证书检查的第二件事,我使用以下代码执行此操作:
System.Net.ServicePointManager.ServerCertificateValidationCallback +=
(sender, cert, chain, sslPolicyErrors) =>
{
if (cert != null) System.Diagnostics.Debug.WriteLine(cert);
return true;
};
我在我的请求之前放置了它,它现在适用于所有设备。 Xamarin再次罢工! :d