这个问题简而言之:
可以使用单个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) 我有一个类,我需要为遗留代码保留一个成员,我需要将其标记为过时,以便新代码不使用它(不会收到警告).
让我们说这个类看起来像这样:
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) 我试图完全理解差分同步算法,特别是保证交付方法(第 4 节)。

我不明白为什么在同步周期的上半部分需要编辑堆栈。
编辑堆栈的用途如下(复制自第 4 节第二段):
[...] 在丢包的情况下,编辑内容会在堆栈中排队,并在每次同步时重新传输到远程方,直到远程方返回接收确认。
这就说得通了。但在第六段的后面(丢失返回数据包的情况)它说:
这表明之前的响应肯定已经丢失。因此,服务器删除其编辑堆栈并将备份阴影复制到阴影文本中(步骤 4)。
所以,据我了解:
在正常操作期间:编辑堆栈(在上半部分)将包含一个条目,该条目将在下一个同步周期期间被确认并删除。
如果出现网络错误:客户端无法确认编辑堆栈,服务器将简单地清除它。
如果这是正确的,则上半部分的编辑堆栈将是空的或包含单个条目。此外,在任何情况下,该单个条目都不会(重新)发送回客户端。让它完全没用?!
显而易见的问题是,为什么我们需要一个编辑堆栈(在上半部分)?
我确信我错过了一些重要的事情。请帮帮我。
我试图在我的 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) Azure的Put Blob REST API操作文档告诉我们,只需一个请求就可以上传高达64 MB的块blob.
我想知道这样的操作是否是原子的.特别是我需要知道以下假设是真还是假.
如果两个或多个客户端同时使用此API指定放置特定的非现有blob If-None-Match: *,则最多其中一个将成功.
使用此API的blob将永远不会被部分暴露.它将不存在或存在于包含元数据的整个内容(<64MB).
任何人都可以确认或反驳这些假设吗?
我需要将用户输入解析为数字并将其存储在十进制变量中。
对我来说,重要的是不要接受任何无法用十进制值正确表示的用户输入。
这对于非常大(或非常小的)数字非常有效,因为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) 我想要打印一个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实现来处理这个,但我宁愿使用框架中的东西(如果可用).
如何获取使用Visual Studio 2017创建的.NET Standard项目的代码覆盖率结果?
我尝试使用Visual Studio附带的功能(菜单→测试→分析代码覆盖率→所有测试).这给了我以下报告:
这不是我的期望,因为:
我的实际项目都没有列出,而是我只看到测试项目.
我没有列出那些测试项目中的代码,而是看到了一些叫做的东西AutoGeneratedProgram.
我尝试过使用dotCover.它只是说它不支持我的项目.
我尝试过使用OpenCover.它说没有任何内容:
现在我已经没事了.任何帮助,将不胜感激!
我在发布的遥测数据到应用程序洞察数据采集终端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详细错误页面)
在.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) 在Linux单处理器系统中,定时器中断与系统处于内核模式还是用户模式无关?
系统处于内核模式时,定时器中断是否有任何不同的行为?