вчера я хотел реализовать метод DidReceiveData для моего NSUrlSessionDataDelegate. Я заметил, что метод DidReceiveData никогда не вызывается, и хотя я пытался отследить ошибку, я заметил, что другие методы тоже не вызывают. Я почти уверен, что другие методы работали раньше, я не знаю, изменил ли я что-то или, возможно, причиной является обновление Xamarin.iOS, но, возможно, я ошибаюсь, и они никогда не работали.
Я могу подтвердить эту проблему для методов DidReceiveResponse, DidReceiveData и DidCompleteWithError.
Вот код, который создает NSUrlSession и обрабатывает ответ (примечание: я вызываю IIS WebMethods, которые отвечают в XML):
public async Task<string> Invoke(string sUrl)
{
session = NSUrlSession.FromConfiguration(NSUrlSessionConfiguration.DefaultSessionConfiguration,
(INSUrlSessionDelegate)new SessionDelegate((x)=> _fehlermeldung = x), // Übergebe Methode damit der SessionDelegate die Fehlermeldung weiterreichen kann
null);
request = CreateGETRequest(CreateNSUrl(sUrl));
var data = session.CreateDataTaskAsync(request, out dataTask);
dataTask.Resume();
NSUrlSessionDataTaskRequest response = null;
try
{
response = await data;
}
catch (NSErrorException ex)
{
throw new Exception(ex.Error.LocalizedDescription + ": " + _fehlermeldung);
}
var doc = new XmlDocument();
doc.LoadXml(response.Data.ToString());
XmlNode elem = doc.DocumentElement.FirstChild;
return elem.InnerText;
}
private NSUrl CreateNSUrl(string url)
{
string converted = ((NSString)url).CreateStringByAddingPercentEscapes(NSStringEncoding.UTF8);
var nsurl = NSUrl.FromString(converted);
if (nsurl == null)
throw new Exception("Fehlerhafte URL: Aus '" + url + "' konnte kein gültiges NSUrl Objekt erzeugt werden.");
return nsurl;
}
private NSMutableUrlRequest CreateGETRequest(NSUrl nsurl)
{
return new NSMutableUrlRequest(nsurl) { HttpMethod = "GET" };
}
А вот моя реализация делегата сессии:
private class SessionDelegate : NSUrlSessionDataDelegate, INSUrlSessionDelegate
{
private readonly Action<string> setFehler;
public SessionDelegate(Action<string> setFehler)
{
this.setFehler = setFehler;
}
public override void DidReceiveResponse(NSUrlSession session, NSUrlSessionDataTask dataTask, NSUrlResponse response, Action<NSUrlSessionResponseDisposition> completionHandler)
{
var http_response = response as NSHttpUrlResponse;
if (http_response == null)
{
setFehler($"Keine HTTP Url Antwort erhalten: {Environment.NewLine}'{response}'");
completionHandler(NSUrlSessionResponseDisposition.Cancel);
return;
}
var status_code = (int)http_response.StatusCode;
if (status_code == 200)
{
completionHandler(NSUrlSessionResponseDisposition.Allow);
}
else
{
setFehler($"Verbindung abgewiesen, HTTP Status: { status_code}, '{ http_response.ToString()}'");
completionHandler(NSUrlSessionResponseDisposition.Cancel);
}
}
public override void DidReceiveData(NSUrlSession session, NSUrlSessionDataTask dataTask, NSData data)
{
// THIS DOES NOT GET CALLED :-(
}
public override void DidCompleteWithError(NSUrlSession session, NSUrlSessionTask task, NSError error)
{
if (error != null)
{
task.Cancel();
var ex = new NSErrorException(error);
throw (ex);
}
}
public override void DidReceiveChallenge(NSUrlSession session, NSUrlSessionTask task, NSUrlAuthenticationChallenge challenge, Action<NSUrlSessionAuthChallengeDisposition, NSUrlCredential> completionHandler)
{
[...] // This is working fine for Client Cert Authentication or Basic Authentication
}
}
Метод DidReceiveChallenge вызывается и работает. Я вырезал его для удобства чтения.
Все остальные методы не вызываются. Я хотел бы знать, что я делаю неправильно. Вы можете найти те же вопросы у нативных пользователей iOS, но я не могу понять, как реализовать их решения с помощью Xamarin.iOS.
Любая помощь приветствуется, спасибо заранее.