Ошибки при попытке использовать HttpWebRequest в Silverlight 2 - PullRequest
1 голос
/ 29 января 2009

Я пытаюсь записать в форму из асинхронного вызова. Примеры, которые я видел в сети, показывают, что это должно работать, но я получаю сообщение об ошибке.

Сначала выполняется вызов, хотя Disbatcher никогда не вызывает p. Во-вторых, я получаю System.Security.SecurityException при вызове req.EndGetResponse (a);

Что может быть причиной проблемы?

public partial class Page : UserControl
{
    Uri url = new Uri("http://www.google.com", UriKind.Absolute);
    HttpWebRequest req;

    private delegate void PrintToUIThread(string text);
    PrintToUIThread p;

    public Page()
    {
        InitializeComponent();
        req = (HttpWebRequest)WebRequest.Create(url);
        p = new PrintToUIThread(print);
        req.BeginGetResponse(new AsyncCallback(WebComplete), req);
    }

    void WebComplete(IAsyncResult a)
    {
        try
        {
            Dispatcher.BeginInvoke(p);
            HttpWebRequest req = (HttpWebRequest)a.AsyncState;
            HttpWebResponse res = (HttpWebResponse)req.EndGetResponse(a);
            Dispatcher.BeginInvoke(p);
        }
        catch (Exception ex)
        {
            print(ex.ToString());
        }
    }

    private void print(string text)
    {
        PageTextBox.Text = text;
    }

    private void print()
    {
        PageTextBox.Text = "Call From Invoke";
    }
}

1 Ответ

1 голос
/ 29 января 2009

Из того, что я вижу, нет ничего плохого в вашем коде запроса / ответа. Вероятно, вы столкнулись с исключением безопасности из-за междоменных ограничений, налагаемых файлом Google crossdomain.xml.

Это crossdomain.xml от Google:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
  <site-control permitted-cross-domain-policies="by-content-type" />
</cross-domain-policy>

Все, что на самом деле говорит: «Привет, приложение RIA, используй прокси». По сути, настройте вызов веб-службы WCF или ASMX на своем «дружественном» сервере с установленным файлом clientaccesspolicy.xml, используйте свой сервер для выполнения запроса http, а затем доставьте результаты обратно. Я не уверен, что Google поддерживает JSONP, но вы также можете попробовать это.

...