У нас была подобная проблема, но немного обратная вашей ситуации - мы предоставляли iframed-контент сайтам на других доменах, поэтому политика одинакового происхождения также была проблемой. После многих часов, проведенных в google, мы в конце концов нашли (немного...) работоспособное решение, которое вы, возможно, сможете адаптировать к своим потребностям.
Есть способ обойти политику одинакового происхождения, но он требует изменений как в содержимом iframed, так и на странице фрейминга, так что если у вас нет возможности запросить изменения с обеих сторон, боюсь, этот метод будет для вас не очень полезен.
Существует причуда браузера, которая позволяет нам обойти политику одинакового происхождения - javascript может общаться либо со страницами на своем собственном домене, либо со страницами, которые он подставил, но никогда со страницами, в которых он подставлен, например, если у вас есть:
www.foo.com/home.html, which iframes
|-> www.bar.net/framed.html, which iframes
|-> www.foo.com/helper.html
то home.html
может общаться с framed.html
(подставлен) и helper.html
(тот же домен).
Communication options for each page:
+-------------------------+-----------+-------------+-------------+
| | home.html | framed.html | helper.html |
+-------------------------+-----------+-------------+-------------+
| www.foo.com/home.html | N/A | YES | YES |
| www.bar.net/framed.html | NO | N/A | YES |
| www.foo.com/helper.html | YES | YES | N/A |
+-------------------------+-----------+-------------+-------------+
framed.html
может отправлять сообщения на helper.html
(iframed), но не home.html
(ребенок не может общаться с родителем через домены).
Ключевым здесь является то, что helper.html
может получать сообщения от framed.html
, и может также общаться с home.html
.
То есть, по сути, когда framed.html
загружается, он определяет свою собственную высоту, сообщает helper.html
, который передает сообщение home.html
, который затем может изменить размер iframe, в котором находится framed.html
.
Самый простой способ передачи сообщений от framed.html
к helper.html
- через аргумент URL. Для этого в framed.html
есть iframe с указанием src='''
. Когда срабатывает его onload
, он оценивает свою собственную высоту и устанавливает src iframe в этот момент в helper.html?height=N
Здесь есть объяснение того, как facebook обрабатывает это, которое может быть немного понятнее, чем мое выше!
В www.foo.com/home.html
требуется следующий код javascript (его можно загрузить из файла .js на любом домене, кстати...):
В www.bar.net/framed.html
:
Содержание www.foo.com/helper.html
:
Вам необходимо подписать обе сборки, потому что по сути обе сборки ссылаются друг на друга.
Вы должны сделать общедоступным ключ в атрибуте InternalsVisibleTo. Например, в буферах протокола я использую:
[assembly:InternalsVisibleTo("Google.ProtocolBuffers.Test,PublicKey="+
"00240000048000009400000006020000002400005253413100040000010001008179f2dd31a648"+
"2a2359dbe33e53701167a888e7c369a9ae3210b64f93861d8a7d286447e58bc167e3d99483beda"+
"72f738140072bb69990bc4f98a21365de2c105e848974a3d210e938b0a56103c0662901efd6b78"+
"0ee6dbe977923d46a8fda18fb25c65dd73b149a5cd9f3100668b56649932dadd8cf5be52eb1dce"+
"ad5cedbf")]
Открытый ключ можно получить, запустив
sn -Tp path\to\test\assembly.dll
. Также можно получить его из файла .snk:
sn -p MyStrongnameKey.snk public.pk
sn -tp public.pk
Я думаю, вам нужно ввести строгое имя, которое будет примерно таким: «Company.Product.Tests, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = 17135d9fcba0119f». Я предполагаю, что Company.Product.Tests - это ваше имя сборки, а 17135d9fcba0119f - открытый ключ.
Другой способ решить эту проблему - не использовать отдельные сборки. Обычно я помещаю исходный код и код тестирования в одну сборку. Я не знаю, есть ли у вас особые опасения, что вы должны их разделить.