Silverlight clientaccesspolicy.xml и хранилище Azure для разработчиков - PullRequest
1 голос
/ 05 февраля 2011

У меня возникают проблемы с пониманием обстоятельств, при которых 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, а затем большой двоичный объект.

Спасибо за помощь, этот поставил меня в тупик.

1 Ответ

1 голос
/ 05 февраля 2011

Трафик на 127.0.0.1 обычно пропускает прокси, поэтому я бы предположил, что у Fiddler просто не было возможности переписать URL. Вы могли бы вместо этого указать Silverlight на ipv4.fiddler и заставить его работать.

...