为什么CloudBlobClient.BaseUri会添加一个尾部斜杠(有时候)?

时间:2013-03-26 20:44:46

标签: c# uri

我开始认为这是一个错误,但我不确定。这是我的情况。

设置信息

我有一个允许上传到Azure存储Blob的网站,并且在Web配置中指定了端点。基本Web配置包含

<blobEndpoint value="http://127.0.0.1:10000/devstoreaccount1" />

测试服务器Web配置包含

<blobEndpoint value="https://myazureaccount.blob.core.windows.net" xdt:Transform="Replace" />

我有一个自定义配置处理程序来从Web配置中检索值,如此

[ConfigurationProperty("blobEndpoint", IsRequired = true)]
public StringConfigurationElement BlobEndpoint
{
    get
    {
        return (StringConfigurationElement)base["blobEndpoint"];
    }
    set
    {
        base["blobEndpoint"] = value;
    }
}

我获得了对此存储帐户的引用

StorageCredentialsAccountAndKey credentials = 
     new StorageCredentialsAccountAndKey(
                     CloudStorageAccount.CloudStorageAccountName,
                     CloudStorageAccount.CloudStorageAccountKey);

this.cloudStorageAccount = new CloudStorageAccount(credentials, 
                     CloudStorageAccount.BlobEndpoint, 
                     CloudStorageAccount.QueueEndpoint, 
                     CloudStorageAccount.TableEndpoint);

然后获取对此类

的云blob客户端的引用
this.cloudBlobClient = this.cloudStorageAccount.CreateCloudBlobClient();

手头的问题

这是我开始得到不同结果的地方。

如果我使用存储模拟器端点(http://127.0.0.1:10000/devstoreaccount1)并进行此调用

this.cloudBlobClient.BaseUri

返回值为http://127.0.0.1:10000/devstoreaccount1

但是,如果我使用我的实际帐户端点(https://myazureaccount.blob.core.windows.net)并进行相同的调用,则返回值为https://myazureaccount.blob.core.windows.net/

注意最后的斜杠。使用存储模拟器uri时为什么?或者,为什么 在使用真实账户uri时会出现?

更新

我从网络配置设置中逐步修改了一个Uri,这是每个案例的输出

{https://myazureaccount.blob.core.windows.net/}
    AbsolutePath: "/"
    AbsoluteUri: "https://myazureaccount.blob.core.windows.net/"
    Authority: "myazureaccount.blob.core.windows.net"
    DnsSafeHost: "myazureaccount.blob.core.windows.net"
    Fragment: ""
    Host: "myazureaccount.blob.core.windows.net"
    HostNameType: Dns
    IsAbsoluteUri: true
    IsDefaultPort: true
    IsFile: false
    IsLoopback: false
    IsUnc: false
    LocalPath: "/"
    OriginalString: "https://myazureaccount.blob.core.windows.net"
    PathAndQuery: "/"
    Port: 443
    Query: ""
    Scheme: "https"
    Segments: {string[1]}
    UserEscaped: false
    UserInfo: ""


{http://127.0.0.1:10000/devstoreaccount1}
    AbsolutePath: "/devstoreaccount1"
    AbsoluteUri: "http://127.0.0.1:10000/devstoreaccount1"
    Authority: "127.0.0.1:10000"
    DnsSafeHost: "127.0.0.1"
    Fragment: ""
    Host: "127.0.0.1"
    HostNameType: IPv4
    IsAbsoluteUri: true
    IsDefaultPort: false
    IsFile: false
    IsLoopback: true
    IsUnc: false
    LocalPath: "/devstoreaccount1"
    OriginalString: "http://127.0.0.1:10000/devstoreaccount1"
    PathAndQuery: "/devstoreaccount1"
    Port: 10000
    Query: ""
    Scheme: "http"
    Segments: {string[2]}
    UserEscaped: false
    UserInfo: ""

似乎这实际上是Uri类的问题,与CloudBlobClient无关。我已适当更新了标签。

1 个答案:

答案 0 :(得分:1)

听起来唯一可能造成这种情况的是

PathAndQuery: "/"

删除它,事情应该锻炼得很好。 此外,如果你需要测试URI类我写了一些非常快的东西,你可以使用它可以节省你很多时间和未来的头痛,如果URI Class返回正确的主机`

var uriList = new List<string>()
    {
        "https://myazureaccount.blob.core.windows.net",
        "https://myazureaccount1.blob.core.windows.net",
        "https://myazureaccount2.blob.core.windows.net"
    };

var holdList = uriList.Select(uriName => new Uri(uriName)).Select(uri => uri.Host).ToList();