Кросс-доменное приложение Silverlight со скриптом - PullRequest
4 голосов
/ 29 октября 2010

У меня проблемы с хостингом междоменных приложений с Silverlight.

У меня есть приложение, размещенное в другом домене и содержащее следующий HTML-код на странице:

<script type="text/javascript">
function succ( sender, args ) {
    console.log("SUCCESS");
    console.log(sender);
    console.log(args);
}
function err( sender, args ) {
    console.log("FAILURE");
    console.log(sender);
    console.log(args);
}
</script>
<object width="400" height="20" id="app" type="application/x-silverlight-2" data="data:application/x-silverlight-2,">
    <param name="minruntimeversion" value="4.0.41108.0"/>
    <param name="autoupgrade" value="false"/>
    <param name="onerror" value="err"/>
    <param name="onload" value="succ"/>
    <param name="enablehtmlaccess" value="true"/>
    <param name="source" value="http://example.com/app.xap"/>
</object>

Но если приложение app.xap размещено в домене, отличном от этого HTML-кода, функция onLoad succ вызывается без аргументов, поэтому она регистрирует следующие строки:

SUCCESS
undefined
undefined

Если я размещаюсь в том же домене, он записывает правильные строки:

SUCCESS
UserControl {}
undefined

Так что в первом случае я не смог добраться до аннотированных методов [ScriptableMember] из javascript, потому что у меня нет ссылокв приложение.

В файле AppManifest.xml я включил атрибут, необходимый для метода HtmlPage.RegisterScriptableObject, как этот:

<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            ExternalCallersFromCrossDomain="ScriptableOnly"
>
    <Deployment.Parts>
    </Deployment.Parts>
</Deployment>

Файл xap передается с application/x-silverlight-app Content-Type, так что это тоже не проблема.

Что мне не хватает?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 29 октября 2010

Предположим, что вы зарегистрировали внешний объект с именем "Thingy".

Вы должны иметь доступ к нему через свойство Content элемента html object.Поместите id="mySL" в тег объекта.Теперь попробуйте этот код: -

function succ( sender, args ) { 
    console.log("SUCCESS"); 
    console.log(document.getElementById("mySL").Content.Thingy); 
    console.log(args); 
} 

Просто обязательно зарегистрируйте «Thingy» в начале вашего кода, как в конструкторе класса, который вы используете в качестве корневого визуала.

0 голосов
/ 16 мая 2014

Та же проблема, и решена так же, как автор темы, описанный в его комментарии

Я должен был поместить весь свой код для сценариев в мой корневой визуальный класс

...