Ошибка отправки веб-запроса

Я получаю эту ошибку при попытке отправить какой-либо WebRequest в Xamarin для iOS.

Я хочу войти на веб-сайт, который отлично работает в Visual Studio C# для Windows-клиента, но для iOS это дает мне эту ошибку.

Unhandled Exception:
MonoTouch.UIKit.UIKitThreadAccessException: UIKit Consistency error: you are calling a UIKit method that can only be invoked from the UI thread.
  at MonoTouch.UIKit.UIApplication.EnsureUIThread () [0x00019] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:49 
  at MonoTouch.UIKit.UITextField.get_Text () [0x00000] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UITextField.g.cs:919 
  at virtualNAX.virtualNAXViewController.SendPost (IAsyncResult Result) [0x00031] in /Users/Emil/Projects/virtualNAX/virtualNAX/virtualNAXViewController.cs:69 
  at System.Net.WebAsyncResult.CB (System.Object unused) [0x00000] in /Developer/MonoTouch/Source/mono/mcs/class/System/System.Net/WebAsyncResult.cs:151 

На строке 68 находится:

Post.Write("email=" + username.Text + "&password=" + password.Text + "&remember=on&redir=index.php%2Fprofile%2F&action=login&submit=+Log+in+");

Если нужно, вот весь мой код:

public void sendData()
{

    HttpWebRequest Web = (HttpWebRequest)WebRequest.Create(dataurl);
    Web.ContentType = "application/x-www-form-urlencoded";
    var cookies = new CookieContainer();
    Web.Method = "POST";
    Web.CookieContainer = cookies;
    Web.BeginGetRequestStream(new AsyncCallback(SendPost), Web);
}

void SendPost(IAsyncResult Result)
{
    HttpWebRequest Web = (HttpWebRequest)Result.AsyncState;
    var Post = new StreamWriter(Web.EndGetRequestStream(Result));


    Post.Write("email=" + username.Text + "&password=" + password.Text + "&remember=on&redir=index.php%2Fprofile%2F&action=login&submit=+Log+in+");
    Post.Close();
    Web.BeginGetResponse(new AsyncCallback(GetData), Web);
}


void GetData(IAsyncResult Result)
{
    HttpWebRequest Web = (HttpWebRequest)Result.AsyncState;

    string forside = new StreamReader(Web.EndGetResponse(Result).GetResponseStream()).ReadToEnd();

    forside = WebUtility.HtmlDecode(forside);

    if (forside.Contains ("Welcome back")) {
        NSUserDefaults.StandardUserDefaults.SetString ("sandt", "logind");
        this.PerformSegue ("toMain", this);
    } else if (forside.Contains ("<div id=\"login_fail\">")) {
        using (UIAlertView alert = new UIAlertView ("Error", "The entered information was incorrect.\n\nPlease try again", null, "OK", null)) {
            alert.Show ();
        }
    } else {
        using (UIAlertView alert = new UIAlertView ("Error", "An unexpected error has occured.\n\nPlease try again later", null, "OK", null)) {
            alert.Show ();
        }
    }
}

1 ответ

Решение

Если "имя пользователя" и "пароль" являются элементами управления пользовательского интерфейса, то вы не можете получить к ним доступ из фонового потока. Вам нужно будет получить их значения и сохранить их в переменных класса (или передать их в качестве параметров) перед вызовом вашего метода.

Другие вопросы по тегам