У меня возникают проблемы с пониманием обстоятельств, при которых Silverlight загружает файл clientaccesspolicy.xml. У меня есть несколько сложностей в среде выполнения, которые нужно объяснить.
Это веб-приложение Azure, работающее в режиме полного IIS в среде разработки. Определены два сайта: App и Admin. Поскольку они оба находятся на порте 80, доступ к ним осуществляется через заголовки хоста app.dev.com и admin.dev.com, у обоих из которых есть записи в моем файле HOSTS, указывающие на 127.0.0.1. Доступ к обоим клиентским приложениям работает нормально. Silverlight загружается и обращается к определенным службам RIA, без проблем.
Ситуация усложняется, когда клиент Silverlight пытается получить доступ к BLOB-объекту из хранилища разработчика. Проблема была объяснена ранее , поэтому я не буду вдаваться в подробности - суть в том, что вы не можете поместить XML-файл в корень Интернета из-за того, как работает хранилище dev (оно переходит к http://127.0.0.1:10000/devstoreaccount1/clientaccesspolicy.xml). Решение - обратный прокси-сервер для переназначения URL - я сделал это с правилом Fiddler . Что это делает, "если приходит запрос на 127.0.0.1:11000, измените этот запрос на: 10000 и получите вместо этого "и т. д.
if (oSession.host == "127.0.0.1:11000") {
oSession.host = "127.0.0.1:10000";
}
if (oSession.url == "127.0.0.1:10000/clientaccesspolicy.xml") {
oSession.url = "127.0.0.1:10000/devstoreaccount1/clientaccesspolicy.xml";
}
Это работает в отношении переназначения; Я могу нажать http://127.0.0.1:11000/clientaccesspolicy.xml в своем браузере и получить файл, который на самом деле живет по адресу 127.0.0.1:10000/devstoreaccount1/clientaccesspolicy.xml:
<?xml version="1.0" encoding="utf-8"?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-methods="*" http-request-headers="*">
<domain uri="*" />
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true" />
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
Затем происходит сбой из-за клиента Silverlight, доступного по номеру http://app.dev.com:81/default.aspx (который напоминает вам, переназначается на 127.0.0.1 в HOSTS)
private void DownloadFile()
{
var sampleUri = new Uri("http://127.0.0.1:11000/devstorageaccount1/mycontainer/myblob.bin");
var client = new WebClient();
client.OpenReadCompleted += blobDownloaded;
client.OpenReadAsync(sampleUri);
}
void blobDownloaded(object sender, OpenReadCompletedEventArgs e)
{
if (e.Error != null) throw e.Error;
//throws
}
за исключением
System.Security.SecurityException ---> System.Security.SecurityException: Security error.
at System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult)
at System.Net.Browser.BrowserHttpWebRequest.<>c__DisplayClass5.<EndGetResponse>b__4(Object sendState)
at System.Net.Browser.AsyncHelper.<>c__DisplayClass2.<BeginOnUI>b__0(Object sendState)
Глядя в Fiddler, файл clientaccesspolicy.xml НЕ был загружен! Я понятия не имею, почему или как его отладить. Я могу скачать блоб из моего браузера. Может кто-нибудь объяснить, почему это бросило бы, прежде чем даже загрузить файл XML?
Затем я попытался обновить эти правила Fiddler:
if (oSession.host == "app.dev.com:10000") {
oSession.host = "127.0.0.1:10000";
}
if (oSession.url == "127.0.0.1:10000/clientaccesspolicy.xml") {
oSession.url = "127.0.0.1:10000/devstoreaccount1/clientaccesspolicy.xml";
}
и изменение URL для загрузки на
var sampleUri = new Uri("http://app.dev.com:10000/devstorageaccount1/mycontainer/myblob.bin");
И это удается! Захват Fiddler показывает загруженный первым файл clientaccesspolicy.xml и второй большой двоичный объект.
Может кто-нибудь помочь объяснить, что здесь происходит? В обоих случаях доступ к приложению Silverlight осуществляется по http://app.dev.com:81/default.aspx.. При попытке загрузить большой двоичный объект из http://127.0.0.1:11000 происходит сбой с исключением SecurityException без первой загрузки clientaccesspolicy.xml. Но когда он загружает большой двоичный объект из http://app.dev.com:10000, он успешно выполняет сначала загрузку clientaccesspolicy.xml, а затем большой двоичный объект.
Спасибо за помощь, этот поставил меня в тупик.