Azure云存储中的Silverlight XAP

时间:2013-02-16 19:41:46

标签: silverlight azure cross-domain blob

我有一个显示绿色矩形的Silverlight xap。

此xap是Azure云中ASP.NET网站的一部分。

为了更容易升级Xap,我已将其作为blob移至云存储中,并使用https网址引用它。

现在Xap没有启动。没有显示错误消息。 xap应该是空白区域。

我在互联网上搜索了一个解决方案。当Xap访问另一个域上的服务或访问另一个域上的blob存储时,有许多解决方案。但这与我的问题不一样。我的xap不访问服务。它显示一个绿色矩形。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

谢谢汤姆和高拉夫让我到那儿。这是我的解决方案:

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访问我的blob存储,因此无法看到根($ root)。通过控制台应用程序上传并设置内容类型。再次,不确定是否需要设置内容类型,但可能是一个问题。

这是我使用的课程:

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"/>