小编Mår*_*röm的帖子

Azure blob的阻止列表为空,但blob不为空!怎么会这样?

这个问题简而言之:

可以使用单个PUT请求创建块blob.这将创建一个带有已提交内容的blob,但blob 将没有任何已提交的块!

这意味着您不能假定已提交块的串联与已提交内容相同.

使用块blob时,你必须特别注意带有空块列表的blob,因为这样的blob 可能是也可能不是空的!


原来的问题:

Azure帐户中的一个存储blob具有空阻止列表,尽管它是非空的.

我正在检索这样的阻止列表(C#):

foreach (var block in _cloudBlob.DownloadBlockList(
    BlockListingFilter.Committed, 
    AccessCondition.GenerateLeaseCondition(_leaseId)))
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

foreach块中的代码未执行.返回的列表为空.

但是,当我检查时,blob报告它具有非零长度: _cloudBlob.Properties.Length

我也可以下载blob,看看它不是空的.

我错过了什么吗?当blob不是时,阻止列表如何为空?!

无论我是否使用BlockListingFilter.Committed,BlockListingFilter.Uncommitted或者BlockListingFilter.All; 清单仍然是空的!

UPDATE

我已将此blob复制到公共容器中,以便任何人都可以复制此问题.

以下是如何重现我无法理解的内容:

首先使用REST API从Azure获取blob属性:

HEAD http://dfdev.blob.core.windows.net/pub/test HTTP/1.1
Host: dfdev.blob.core.windows.net
Run Code Online (Sandbox Code Playgroud)

响应:

HTTP/1.1 200 OK
Content-Length: 66
Content-Type: application/octet-stream
Last-Modified: Sat, 02 Feb 2013 09:37:19 GMT
ETag: 0x8CFCF40075A5F31
Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
x-ms-request-id: 4b149a7e-2fcd-4ab4-8d53-12ef047cbfa1
x-ms-version: 2009-09-19
x-ms-lease-status: unlocked
x-ms-blob-type: BlockBlob
Date: Sat, 02 Feb 2013 09:40:54 …
Run Code Online (Sandbox Code Playgroud)

azure azure-storage azure-storage-blobs

6
推荐指数
1
解决办法
1777
查看次数

具有属性访问器的过时成员字段(Visual Studio错误)

我有一个类,我需要为遗留代码保留一个成员,我需要将其标记为过时,以便新代码不使用它(不会收到警告).

让我们说这个类看起来像这样:

class MyClass
{
    [Obsolete]
    private string _old = "...";

    [Obsolete]
    public string Old
    {
        get { return _old; }
    }
}
Run Code Online (Sandbox Code Playgroud)

我声明成员字段_old已过时,以确保类中的新代码不使用该字段.

我还声明该属性Old已过时,以确保该类外的代码不使用该属性.

当我编译它时,我在属性getter中得到一个警告,说它_old已经过时了.我认为编译器会默默地忽略它,因为属性本​​身已经过时了.

我是否遗漏了某些东西,或者我是否需要#pragma warning disable/restore在其使用的任何地方添加过时的成员字段(即使方法/属性本身被标记为过时)?


" 我认为编译器会默默地忽略它 "的原因是因为它似乎对过时的类这样做:

[Obsolete]
public class MyObsoleteClass
{
    public string DoSomething()
    {
        // No warning here, since the class itself is obsolete
        return new MyClass().Old;
    }
}
Run Code Online (Sandbox Code Playgroud)

正如@Heinzi所回答:这似乎是由于Visual Studio中的一个错误.我已经提交了关于连接的报告:

https://connect.microsoft.com/VisualStudio/feedback/details/1146809


事实证明,Visual Studio中的错误不仅限于从属性访问过时的字段.

从过时的方法访问过时的属性不应该产生警告:

public class Class2
{
    [Obsolete]
    public …
Run Code Online (Sandbox Code Playgroud)

c# obsolete

5
推荐指数
1
解决办法
1227
查看次数

了解 Neil Fraser 的差分同步算法

我试图完全理解差分同步算法,特别是保证交付方法(第 4 节)。

同步周期

我不明白为什么在同步周期的上半部分需要编辑堆栈。

编辑堆栈的用途如下(复制自第 4 节第二段):

[...] 在丢包的情况下,编辑内容会在堆栈中排队,并在每次同步时重新传输到远程方,直到远程方返回接收确认。

这就说得通了。但在第六段的后面(丢失返回数据包的情况)它说:

这表明之前的响应肯定已经丢失。因此,服务器删除其编辑堆栈并将备份阴影复制到阴影文本中(步骤 4)。

所以,据我了解:

  • 在正常操作期间:编辑堆栈(在上半部分)将包含一个条目,该条目将在下一个同步周期期间被确认并删除。

  • 如果出现网络错误:客户端无法确认编辑堆栈,服务器将简单地清除它。

如果这是正确的,则上半部分的编辑堆栈将是空的或包含单个条目。此外,在任何情况下,该单个条目都不会(重新)发送回客户端。让它完全没用?!

显而易见的问题是,为什么我们需要一个编辑堆栈(在上半部分)?

我确信我错过了一些重要的事情。请帮帮我。

algorithm synchronization

5
推荐指数
1
解决办法
1067
查看次数

在 iOS Swift 中设置提醒

我试图在我的 swift 应用程序中设置一个简单的 EKReminder 来提醒用户赶公交车。但是,当我尝试保存提醒时,我总是收到错误(没有报告错误,应用程序只是崩溃)。我有下面的代码。

public class func createReminder(reminderTitle: String, timeInterval:      NSDate) {
    var calendarDatabase = EKEventStore()

    calendarDatabase.requestAccessToEntityType(EKEntityTypeReminder,
        completion: nil)

    let reminder = EKReminder(eventStore: calendarDatabase)

    reminder.title = reminderTitle

    let alarm = EKAlarm(absoluteDate: timeInterval)

    reminder.addAlarm(alarm)

    reminder.calendar = calendarDatabase.defaultCalendarForNewReminders()

    var error: NSError?

    calendarDatabase.saveReminder(reminder, commit: true, error: &error)
}
Run Code Online (Sandbox Code Playgroud)

ios ekeventstore swift

5
推荐指数
2
解决办法
1万
查看次数

Azure Put Blob操作是原子的吗?

Azure的Put Blob REST API操作文档告诉我们,只需一个请求就可以上传高达64 MB的块blob.

我想知道这样的操作是否是原子的.特别是我需要知道以下假设是真还是假.

  1. 如果两个或多个客户端同时使用此API指定放置特定的非现有blob If-None-Match: *,则最多其中一个将成功.

  2. 使用此API的blob将永远不会被部分暴露.它将不存在或存在于包含元数据的整个内容(<64MB).

任何人都可以确认或反驳这些假设吗?

azure azure-storage

5
推荐指数
1
解决办法
876
查看次数

解析十进制数而不丢失有效数字

我需要将用户输入解析为数字并将其存储在十进制变量中。

对我来说,重要的是不要接受任何无法用十进制值正确表示的用户输入。

这对于非常大(或非常小的)数字非常有效,因为Parse方法在这些情况下会抛出OverflowException

但是,当数字具有太多有效数字时,Parse方法将默默地返回截断(或四舍五入?)的值。

例如,解析1.23456789123456789123456789123(30 位有效数字)的结果等于1.2345678912345678912345678912(29 位有效数字)。

这是根据规范规定的,十进制值的精度为 28-29 位有效数字。

但是,我需要能够检测(并拒绝)解析时将被截断的数字,因为在我的情况下丢失有效数字是不可接受的。

解决这个问题的最佳方法是什么?


请注意,通过字符串比较进行预解析或后验证并不是一个简单的方法,因为我需要支持各种特定于文化的输入和各种数字样式(空格、千位分隔符、括号、指数语法、 ETC)。

因此,我正在寻找一种解决方案,而不重复 .NET 提供的解析代码。


我目前正在使用此解决方法来检测具有 28 个或更多有效数字的输入。虽然这有效,但它有效地将所有输入限制为最多 27 个有效数字(而不是 28-29):

/// <summary>
///     Determines whether the specified value has 28 or more significant digits, 
///     in which case it must be rejected since it may have been truncated when 
///     we parsed it.
/// </summary>
static bool …
Run Code Online (Sandbox Code Playgroud)

.net c# parsing numbers

5
推荐指数
1
解决办法
1569
查看次数

使用缩进和xml保存XDocument:space ="preserve"

我想要打印一个XDocument但是在xml:space="preserve"元素内部留下空白.

这个片段:

new XDocument(
    new XElement("a",
        new XElement("b",
            new XElement("c"))))
    .Save(Console.Out);
Run Code Online (Sandbox Code Playgroud)

导致以下缩进输出结果(这只是我想要的):

<a>
  <b>
    <c />
  </b>
</a>
Run Code Online (Sandbox Code Playgroud)

但是,假设我需要在<b>元素中保留空格:

new XDocument(
    new XElement("a",
        new XElement("b",
            new XAttribute(XNamespace.Xml + "space", "preserve"),
            new XElement("c"))))
    .Save(Console.Out);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我得到以下输出:

<a>
  <b xml:space="preserve">
    <c />
  </b>
</a>
Run Code Online (Sandbox Code Playgroud)

这是不好的,因为加入压痕xml:space="preserve"范围.在这种情况下的预期输出将是:

<a>
  <b xml:space="preserve"><c /></b>
</a>
Run Code Online (Sandbox Code Playgroud)

我很惊讶XDocument默认不支持这个.

是否有可能从XDocument 获得漂亮的打印(缩进)输出并保持xml:space="preserve"原样内的空白

我理解一个选项是编写我自己的XmlWriter实现来处理这个,但我宁愿使用框架中的东西(如果可用).

.net c# xml

5
推荐指数
1
解决办法
863
查看次数

.NET Standard项目的代码覆盖率

如何获取使用Visual Studio 2017创建的.NET Standard项目的代码覆盖率结果?

  • 我尝试使用Visual Studio附带的功能(菜单→测试→分析代码覆盖率→所有测试).这给了我以下报告:

    在此输入图像描述

    这不是我的期望,因为:

    • 我的实际项目都没有列出,而是我只看到测试项目.

    • 我没有列出那些测试项目中的代码,而是看到了一些叫做的东西AutoGeneratedProgram.

  • 我尝试过使用dotCover.它只是说它不支持我的项目.

  • 我尝试过使用OpenCover.它说没有任何内容:

    在此输入图像描述

现在我已经没事了.任何帮助,将不胜感激!

code-coverage visual-studio-2017 .net-standard

5
推荐指数
1
解决办法
2324
查看次数

升级到.NET Core 2.1后Http请求中断

我在发布的遥测数据到应用程序洞察数据采集终端https://dc.services.visualstudio.com/v2/track使用HttpClient

使用.NET Core 2.0时,此方法工作正常。但是,升级到.NET Core 2.1之后,所有请求都将失败,并显示HTTP状态500 Internal Server Error和如下所示的HTML响应正文:

IIS 8.5详细错误

这是一个IIS 8.5详细错误页面

在.NET Core 2.1中,他们更改HttpClientHandler工作方式,并添加了一个AppContext允许我们保留旧行为的开关:

AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false);
Run Code Online (Sandbox Code Playgroud)

确实,设置此开关可以解决问题!

但我想避免使用该开关:

  • 首先,因为我想使用新的东西。它必须更好:-)
  • 其次,因为该开关会更改所有HttpClientHandler实例的行为。不只是我用来将数据发布到Application Insights端点的那个。

我试图通过使用Wireshark查看流量来找出导致此问题的原因。试图以这种低水平解释HTTPS流量超出了我的范围。我在TLS握手中确实发现了一些可疑的东西。

这两个SocketsHttpHandler(即不工作)和传统WinHttpHandler(即做的工作)使用TLS 1.2。但是,仅WinHttpHandler使用TLS证书状态请求扩展名。这可能是请求失败的原因吗?

在任何情况下,都将建立TLS连接,发送请求并检索响应。在处理请求时,服务器端显然存在错误。

我想找出导致此问题的原因。任何帮助表示赞赏!


正如@mjwills所建议的那样,我更改了代码,使其使用HTTP(而非SSL)并将其发布到允许我捕获请求的本地程序中。(我没有弄清楚如何在Wireshark中以干净的方式执行此操作,因此我最终基于编写了自己的小捕获工具TcpListener):

使用新版本时捕获SocketsHttpHandler

POST / HTTP/1.1
Transfer-Encoding: chunked
Content-Type: application/x-json-stream
Content-Encoding: gzip
Host: localhost:12345

A
[...10 bytes of data...]
F4
[...244 …
Run Code Online (Sandbox Code Playgroud)

c# ssl http azure-application-insights .net-core

5
推荐指数
0
解决办法
310
查看次数

定时器中断是否与系统处于内核模式还是用户模式无关?

在Linux单处理器系统中,定时器中断与系统处于内核模式还是用户模式无关?

系统处于内核模式时,定时器中断是否有任何不同的行为?

linux linux-device-driver linux-kernel

4
推荐指数
1
解决办法
5535
查看次数