Facebook crossdomain.xml ошибка silverlight - PullRequest
9 голосов
/ 25 июля 2011

У меня проблема с файлом crossdomain.xml, расположенным на фото-серверах Facebook.Первая проблема возникает, когда Silverlight запрашивает clientaccesspolicy.xml - серверы Facebook возвращают 403 - Доступ запрещен, что нормально, поскольку на их серверах также развернут файл crossdomain.xml.Затем Silverlight запрашивает этот crossdomain.xml, и в ответ он получает именно такой ответ:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain- policy.dtd">
<cross-domain-policy>
    <allow-access-from domain="*" secure="false" to-ports="*" />
    <site-control permitted-cross-domain-policies="master-only" />
</cross-domain-policy>

Затем я немного поиграл с этим, развернул этот crossdomain.xml на своих серверах и получил те же результаты.- исключение безопасности.Затем я начал что-то делать и пришел к выводу, что все будет работать так, как я хотел, только если я уберу атрибут to-ports = "*" ?У кого-нибудь есть идеи, как это преодолеть, у кого-то была такая же проблема раньше или я что-то не так делаю?

Ответы [ 2 ]

2 голосов
/ 20 января 2012

Я столкнулся с той же проблемой при попытке программно получить изображения из Facebook.Странно то, что если вы указываете элемент управления изображением Silverlight на URL-адрес изображения Facebook, изображение извлекается и отображается без ошибок.Это заставило меня задуматься, и я нашел жизнеспособный обходной путь, который, кажется, работает последовательно для моей ситуации.Надеюсь, вы тоже найдете его полезным.

var uri = new Uri("http://graph.facebook.com/mglace/picture/", UriKind.Absolute);
var bmp = new BitmapImage();

bmp.ImageOpened += (sender, e) => { /* Do something here with the sender (which is the BitmapImage) */ };
bmp.CreateOptions = BitmapCreateOptions.None;
bmp.UriSource = uri;

Создайте объект BitmapImage, установите обработчик события для события ImageOpened и установите для свойства CreateOptions значение BitmapCreateOptions.None.Наконец, установите UriSource на изображение Facebook, которое вы хотите получить.Изображение загружается немедленно, потому что мы установили CreateOptions на None (значение по умолчанию DelayedCreation).Затем вы можете выполнять любые действия, которые вам нужны, в обработчике событий ImageOpened.

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

public IObservable<BitmapImage> GetProfilePhoto(string profileId)
{
    return Observable.Create<BitmapImage>(
        observer =>
            {
                // This handler handles a successful fetch
                EventHandler<RoutedEventArgs> openedHandler =
                    (sender, args) =>
                        {
                            try
                            {
                                observer.OnNext(sender as BitmapImage);
                                observer.OnCompleted();
                            }
                            catch (Exception ex)
                            {
                                observer.OnError(ex);
                            }
                        };

                // This handler handle a failure
                EventHandler<ExceptionRoutedEventArgs> failedHandler =
                    (sender, args) => observer.OnError(args.ErrorException);

                var url = string.Format("http://graph.facebook.com/{0}/picture/", profileId);
                var uri = new Uri(url, UriKind.Absolute);

                BitmapImage bmp = null;

                try
                {

                    Deployment.Current.Dispatcher.BeginInvoke(
                        () =>
                            {
                                bmp = new BitmapImage();

                                bmp.ImageOpened += openedHandler;
                                bmp.ImageFailed += failedHandler;

                                bmp.CreateOptions = BitmapCreateOptions.None;
                                bmp.UriSource = uri;
                            });
                }
                catch (Exception ex)
                {
                    observer.OnError(ex);
                }

                return () =>
                            {
                                // Cleanup the event handlers
                                if (bmp != null)
                                {
                                    bmp.ImageOpened -= openedHandler;
                                    bmp.ImageFailed -= failedHandler;
                                }
                            };
            });
}

И использование:

GetProfilePhoto("mglace")
    .Subscribe(image => { /* Do something with the image in here*/  },
               error => { /* Handle any errors in here */ },
               () => { /* Finalization code goes here */ });

Я надеюсь, что кто-то найдет это полезным.

0 голосов
/ 12 декабря 2011

Это все еще не решено в Silverlight 5. Кажется, Facebook тоже не обеспокоен.

...