私をそこに連れて行ってくれて、Tom と Gaurav に感謝します。これが私の解決策です:
1) 「clientaccesspolicy.xml」というファイルを作成しました。小文字を使用しましたが、それが重要かどうかはわかりません。ファイルに次のように記述します。
<?xml version="1.0" encoding="utf-8"?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="SOAPAction">
<domain uri="*"/>
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
2) このファイルを BLOB コンテナーのルートにアップロードしました。VS2010 を使用してブロブ ストレージにアクセスしているため、ルート ($root) が表示されません。content-type をアップロードして設定するためのコンソール アプリを作成しました。繰り返しますが、コンテンツ タイプの設定が必要かどうかはわかりませんが、落とし穴になる可能性があります。
これは私が使用したクラスです:
namespace ConsoleApplication
{
/// <summary>
///
/// </summary>
public class BlobStorageContainer
{
/////////////////////////////////////////////////////////////
// Constants
private const string BLOB_CONNECTION = <get this from the windows azure portal>;
public const string ROOT_CONTAINER_NAME = "$root";
/////////////////////////////////////////////////////////////
// Attributes
private static CloudStorageAccount _storageAccount;
private static CloudBlobClient _blobClient;
private CloudBlobContainer _container;
/////////////////////////////////////////////////////////////
// Construction
static BlobStorageContainer()
{
// Create storage account
_storageAccount = CloudStorageAccount.Parse(BLOB_CONNECTION);
// Construct cloud blob client
_blobClient = _storageAccount.CreateCloudBlobClient();
}
public BlobStorageContainer(string strContainer)
{
// Get the audio-files container
_container = _blobClient.GetContainerReference(strContainer);
try
{
// If container does not exist...
if (!_container.Exists())
{
// Create container
_container.CreateIfNotExists();
// Set permissions
BlobContainerPermissions permissions = new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Blob };
_container.SetPermissions(permissions);
}
}
catch (Exception x)
{
// Reset reference
_container = null;
// throw back
throw x;
}
}
/////////////////////////////////////////////////////////////
// Operations
public void SetContentType(string strName, string strContentType)
{
// Retrieve the block-blob
CloudBlockBlob blob = _container.GetBlockBlobReference(strName);
if (blob.Exists())
{
// If props need changing...
if (blob.Properties.ContentType != strContentType)
{
// Set properties
blob.Properties.ContentType = strContentType;
blob.SetProperties();
}
}
}
public void UploadFile(string strFilepath,string strName)
{
// Get blob
CloudBlockBlob blob = _container.GetBlockBlobReference(strName);
// Open file
using(FileStream fs = new FileStream(strFilepath,FileMode.Open,FileAccess.Read))
{
blob.UploadFromStream(fs);
} // using fs
}
public void WalkBlobs(Func<string, long, string, bool> fnCallback)
{
// Loop through the blobs
foreach (IListBlobItem loop in _container.ListBlobs())
{
// If this is a block blob...
if (loop is CloudBlockBlob)
{
// Get the blob
CloudBlockBlob blob = loop as CloudBlockBlob;
// Callback function
bool bContinue = fnCallback(blob.Name, blob.Properties.Length, blob.Properties.ContentType);
if (!bContinue)
break;
}
}
}
}
}
次に、 Main 関数でこれを行いました。
// Open container
BlobStorageContainer container = new BlobStorageContainer(BlobStorageContainer.ROOT_CONTAINER_NAME);
// Upload file
container.UploadFile(@"D:\Workspace\clientaccesspolicy.xml", "clientaccesspolicy.xml");
// Set content type
container.SetContentType("clientaccesspolicy.xml", "text/xml");
3) HTML で、XAP URL を HTTPS から HTTP に変更しました。何らかの理由で、これは機能しませんでした:
<param name="source" value="https://<blobaccount>.blob.core.windows.net/container1/MySilverlight.xap"/>
しかし、これは:
<param name="source" value="http://<blobaccount>.blob.core.windows.net/container1/MySilverlight.xap"/>