小编JAL*_*RED的帖子

SHA1Managed.ComputeHash在不同的服务器上偶尔会有所不同

背景(您可以跳过本节)

我有大量的数据(大约3 MB)需要在几百台机器上保持最新.有些机器运行C#,有些运行Java.数据可能随时发生变化,需要在几分钟内传达给客户.数据以4个负载平衡服务器以Json格式提供.这4台服务器运行的是带有Mvc 3和C#4.0的ASP.NET 4.0.

在4台服务器上运行的代码具有散列算法,该算法散列Json响应,然后将散列转换为字符串.此哈希值将提供给客户端.然后,每隔几分钟,客户端使用散列ping服务器,如果散列已过期,则返回新的Json对象.如果散列仍然是当前的,则返回具有emptry体的304.

有时,4个框生成的哈希在框中不一致,这意味着客户端不断下载数据(每个请求可能会遇到不同的服务器).

代码Snipet

以下是用于生成哈希的代码.

internal static HashAlgorithm Hasher { get; set; }
...
Hasher = new SHA1Managed();
...
Convert.ToBase64String(Hasher.ComputeHash(Encoding.ASCII.GetBytes(jsonString)));
Run Code Online (Sandbox Code Playgroud)

为了尝试调试问题,我将其拆分为:

Prehash = PreHashBuilder.ToString();
ASCIIBytes = Encoding.ASCII.GetBytes(Prehash);
HashedBytes = Hasher.ComputeHash(ASCIIBytes);
Hash = Convert.ToBase64String(HashedBytes);
Run Code Online (Sandbox Code Playgroud)

然后我添加了一个吐出上述值的路线,并使用Beyond Compare来比较差异.

使用以下命令将字节数组转换为字符串格式以供BeyondCompare使用:

private static string GetString(byte[] bytes)
{
    StringBuilder sb = new StringBuilder();
    foreach (byte b in bytes)
    {
        sb.Append(b);
    }
    return sb.ToString();
} 
Run Code Online (Sandbox Code Playgroud)

如您所见,字节数组作为字节序列显示在字面上.它不是'转换'.

问题

我发现Prehash和ASCIIBytes值相同,但HashedBytes值不同 - 这意味着Hash也不同.

我在4个服务器盒上重启了几次IIS WebSite,当它们有不同的哈希时,比较BeyondCompare中的值.在每一个案例中,它都是"HashedBytes"值不同(SHA1Managed.ComputeHash(...)的结果)

问题

我究竟做错了什么?ComputeHash函数的输入是相同的.SHA1Managed机器是否依赖?这并不是因为因为4台机器有一半的时间具有相同的哈希值.

我搜索过StackOverFlow和Bing但是却无法找到其他任何有这个问题的人.我能找到的最接近的是那些编码有问题的人,但我想我已经证明编码不是问题.

产量

我希望不要把所有东西都放在这里,因为它有多长,但这里是我正在比较的转储的狙击:

哈希:o1ZxBaVuU6OhE6De96wJXUvmz3M =
HashedBytes:163861135165110831631611916022224717299375230207115
ASCIIBytes:.... Prehash:... …

c# hash encoding sha1

7
推荐指数
1
解决办法
4580
查看次数

超时异常 - 请求排队?线程不够?

背景:

我有一个服务,它聚合来自多个其他服务的数据.为了使事情及时发生,我在整个代码中使用异步,然后将各种请求收集到任务列表中.

以下是代码的一些摘录:

private async Task<List<Foo>> Baz(..., int timeout)
{
    var tasks = new List<Task<IEnumerable<Foo>>>();
    Tasks.Add(GetFoo1(..., timeout));
    Tasks.Add(GetFoo2(..., timeout));
    // Up to 6, depending on other parameters.  Some tasks return multiple objects.

    return await Task.WhenAll(tasks).ContinueWith((antecedent) => { return antecedent.Result.AsEnumerable().SelectMany(f => f).ToList(); }).ConfigureAwait(false);
}    
private async Task<IEnumerable<Foo>> GetFoo1(..., int timeout)
{
Stopwatch sw = new Stopwatch();
sw.Start();

    var value = await SomeAsyncronousService.GetAsync(..., timeout).ConfigureAwait(false);

sw.Stop();
// Record timing...
    return new[] { new Foo(..., value) };
}
private async Task<IEnumerable<Foo>> GetFoo2(..., int timeout) …
Run Code Online (Sandbox Code Playgroud)

c# task-parallel-library async-await dotnet-httpclient

7
推荐指数
1
解决办法
1729
查看次数

Docker的Visual Studio工具 - PrepareForCompile任务意外失败

我拿了一台干净的机器(没有周年纪念更新的Windows 10企业版)并安装(按此顺序)完整的IIS,Hyper-V,VS2015企业版,.NET Core 1.0.1工具预览版2,适用于Windows的Docker,Visual Studio Docker工具和其他一些随机程序.

然后我打开VS2015并创建了一个默认的.NET核心网站.当我跑(F5)时,所有工作都按预期进行.然后我右键单击该项目并转到Add->Docker Support.现在,当尝试使用Docker运行(F5)时,我看到以下错误消息:

MSB4018"PrepareForCompile"任务意外失败.Microsoft.DotNet.Docker.CommandlineClientException:来自守护程序的错误响应:Container ...未在...运行

我在网上搜索过,我能找到的唯一可以解释的是我不认为共享驱动器正在工作.我确实在Docker-> Shared Drives中设置了它,但是当我运行时: docker run --rm -v c:/Users:/data alpine ls /data 响应为空.

同样,当我尝试使用busy box时,目录为空.

docker run -it -v /C/Users:/wormhole busybox cd wormhole ls

我已经尝试使用Windows桌面的Docker 1.12.1-stable和beta 26.两者都有相同的问题.

有些人表示防病毒可能会导致问题.我确实安装了Mcafee,但我无法卸载或禁用防病毒软件.

有些人认为具有不寻常字符的密码可能会导致此问题,但这不适用于此处.

我不知道共享驱动器是否会导致VS2015错误,但由于共享驱动器坏了,它似乎是一个很好的起点.

我已多次重启bot hdock和计算机,但无济于事.

有任何想法吗?

docker visual-studio-2015 asp.net-core docker-for-windows docker-desktop

7
推荐指数
2
解决办法
2468
查看次数

我应该创建多少个 HttpClient?

最初我的代码在每个请求的 using 语句中创建了一个新的 HttpClient 。然后我阅读了几篇关于重用 HttpClient 来提高性能的文章。

这是一篇这样的文章的摘录:

我不建议在 Using 块内创建 HttpClient 来发出单个请求。当 HttpClient 被释放时,它也会导致底层连接也被关闭。这意味着下一个请求必须重新打开该连接。您应该尝试重新使用您的 HttpClient 实例。

http://www.bizcoder.com/httpclient-it-lives-and-it-is-glorious

在我看来,只有当多个请求连续发送到同一个地方时,保持连接打开才有用 - 例如 www.api1.com。

我的问题是,我应该如何创建 HttpClients?

我的网站在后端讨论了大约十种不同的服务。

我应该创建一个 HttpClient 供所有人使用,还是应该为后端使用的每个域创建一个单独的 HttpClient?

示例:如果我与 www.api1.com 和 www.api2.com 交谈,我应该创建 2 个不同的 HttpClient,还是只创建一个 HttpClient?

c# dotnet-httpclient

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

如何使用Querystring而不是';'

我一直在编写一个内部工具,供开发人员使用由C#WebApi支持的Angular2 beta 15.

随着新版本的发布,我升级了Angular2版本

我从第1天开始使用路由,但现在我需要添加可选参数.通常,这是通过查询字符串完成的.

但是,Angular2在查询字符串之前包含可选参数,如下所示:

http://www.example.com;a=b;c=4
Run Code Online (Sandbox Code Playgroud)

最初我觉得这很好,即使它不是我习惯的.但是,我现在遇到了需要"潜在危险的Request.Path值[s]"的情况,例如"*"(用于保存预先填充的正则表达式搜索字段的链接).

我可以想到几个修复,包括:

  1. 用*替换不同的符号表示开发人员必须知道特殊符号才能释放URL.
  2. Url对参数进行编码 - 意味着开发人员必须知道url编码的值以释放url.
  3. 当这些参数有特殊字符时排除这些参数 - 如果开发人员使用*免费提交网址,页面仍然会中断.
  4. 从pre-querystring参数切换到querystring参数.
  5. 手动控制查询字符串.

大多数简单的正则表达式在没有编码的查询字符串中完全有效,这意味着(4)和(5)都是有效的解决方案.

(5)是可能的,但我无法想象我是唯一遇到过这个问题的人.如果存在官方解决方案,我宁愿不创建自己的解决方法.

(4)是我的首选解决方案.我发现的许多较旧的示例都在查询字符串中显示了可选参数,因此我希望逻辑仍然存在,并且分号版本只是默认选项.

是否有可能告诉路由器使用查询字符串参数而不是现在使用的分号分隔的东西?

我搜索了angular.io和stackoverflow,找不到任何答案或任何人问这个问题.

谢谢.

angular2-routing angular

6
推荐指数
2
解决办法
6717
查看次数

当枚举位于路径中时,Swashbuckle / Swagger 缺少枚举信息

我有一个 C# .Net 6 API,使用 Swashbuckle 为客户端生成 Swagger 文档。

我安装了 Swashbuckle.AspNetCore 6.3.1 和 *.Filters 7.02。

在 Startup.cs 中,我有

...
    swaggerOptions.UseInlineDefinitionsForEnums();
    swaggerOptions.SchemaFilter<EnumDescriptionFilter>(); // Custom filter.
...

.AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
        options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
    })
Run Code Online (Sandbox Code Playgroud)

我在 API 中有几个字符串序列化的枚举。当枚举位于查询字符串中时,这非常有效: 在此输入图像描述

但是,当枚举位于路径中时,这不起作用: 在此输入图像描述

我尝试过摆弄配置、尝试 Annotations 包、切换到 Newtonsoft 等,但没有这样的运气。

如果我将参数的类型更改为字符串,那么我会在 swagger 中得到一种字符串类型,但我没有得到可能的值。

知道我缺少什么吗?

谢谢。


更新。进一步尝试后,在查询字符串中只有列表正确显示。如果我添加[FromQuery] VehicleType vehicleType到路线,那么它显示时没有类型。

同时,[FromQuery] List<VehicleType> vehicleTypes正确显示。


更新2:看起来这是 OpenAPI.NET 的问题 https://github.com/domaindrivendev/Swashbuckle.AspNetCore/issues/1329#:~:text=Enum%20type%20is%20missing%20%28look%20at% 20JustEnum%20in,和%20serialization%20to%20JSON%20behavior%20from%20that%20library

根据该线程,这是解决该错误的方法:

swaggerGenOptions.UseInlineDefinitionsForEnums();
Run Code Online (Sandbox Code Playgroud)

c# enums swagger swashbuckle.aspnetcore

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

Angular2:ngIf,不破坏组件

我有一个带有选项卡控件的网页,它占据了屏幕的一部分。这些选项卡使用* ngIf显示/隐藏,并将所选选项卡与枚举进行比较。因此,每当用户更改选项卡时,便会破坏/创建组件。

通常这很好,但是其中一个选项卡包含一个必应地图。每次选择该标签时,都会重新加载地图控件-使地图短暂显示当前IP位置,直到加载了所需的位置和引脚(不到一秒钟的时间)。

我能够解决这个问题的唯一方法是停止为该选项卡使用* ngIf,而是设置自定义样式:

.hide {高度:0像素;溢出:隐藏;}

到目前为止,这似乎很有效,但是我担心这会在将来引起错误。

有angular2祝福的方式隐藏组件而不破坏组件吗?

谢谢。

bing-maps angular

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