小编Rei*_*l--的帖子

如何测试我的.Net客户端使用的TLS版本

我支持一个.NET站点(其中很多,很多,其他东西)与供应商系统的远程API进行通信.

我们想升级以支持TLS 1.2我们希望按照这个问题这样做:是否有TLS 1.2的.NET实现?

但是,一旦我做出改变,我该如何检查这是否真的有效.

理想情况下,我的一个供应商网站将开始使用TLS 1.2 ,然后我的测试可能就是"我们现在可以与该供应商交谈吗?" 但我们没有那个.我猜我可以用某种类型的数据包嗅探器做一些事情,但我不知道我究竟在寻找什么,也不知道如何设置嗅探器以可读的方式收集必要的数据.

或者:

  • 有人可以指出我如何在Fiddler/WireShark中收集数据的综合指南

要么

  • 有人可以建议另一种方法来测试变更是否有效.

.net fiddler wireshark packet-sniffers tls1.2

39
推荐指数
3
解决办法
4万
查看次数

C# 是否保证分支嵌套表达式的求值顺序?

显然,C# 可以处理嵌套表达式和链式表达式。如果嵌套和/或链接是线性的,那么很明显表达式的计算顺序是:

Foo(Bar(Baz().Bop()))只能以下顺序评估:

  • Baz()
  • Bop()
  • Bar()
  • Foo()

但如果嵌套不是线性的怎么办?考虑:Foo(Baz()).Bar(Bop())

显然以下内容必须全部为真:

  • BazFoo
  • FooBar
  • BopBar

但目前尚不清楚具体何时Bop进行评估。以下任何一项都是可行的订单:

  • 可能性#1
    • Bop()
    • Baz()
    • Foo()
    • Bar()
  • 可能性#2
    • Baz()
    • Bop()
    • Foo()
    • Bar()
  • 可能性#3
    • Baz()
    • Foo()
    • Bop()
    • Bar()

我的直觉是第三个选项可能是正确的。即它会Foo(Baz())在开始评估任何一个之前进行全面评估.Bar(Bop())

虽然我当然可以测试个别情况来看看会发生什么,但这并不能告诉我我的猜测是否总是会发生的?

但我的问题是: 分支嵌套表达式的求值顺序是定义为 C# 语言规范的一部分,还是留给编译器根据情况判断?

如果不是,至少知道它是确定性的吗?

c# evaluation expression specifications

29
推荐指数
1
解决办法
961
查看次数

C#中的"抽象"界面

这是一个学术问题. 可以说它背后有一个XY问题,我可以稍后单独发布.但我真正的学术问题特别感兴趣,在这里.


我经常发现我有一组接口,它们都有共同的属性.我想要定义一个基本接口以使其共同化,部分原因是缺乏重复,部分原因是我可以在不知道确切类型的情况下传递对象并使用常用方法.

也许我有IFooRepository,IBarRepository等等,我可以宣布IRepository<TEntity>.

或者我有IHappyBot,ISadBot,IConfusedBot,都具有IBot共同点.

值得注意的是,没有一个类可以直接实现这些基本接口 - 你永远不会有一些只能 实现的东西IBot.

如果我们在讨论的层次结构而不是接口,那么我会说"啊......基本的东西是抽象类".

有什么类似的东西我可以用接口来记录IBot不会直接实现的期望.

我感兴趣的一个方面是做一些你以后可以通过反射检测的东西,这样当我测试我的DI设置时,我可以说"啊,这个界面不应该是可绑定的,因为它是"抽象的" .


我主要关心C#,但是如果这个功能特别存在于其他主要语言中,那么听到它会很有趣.

c# abstract-class interface

18
推荐指数
2
解决办法
2928
查看次数

`AsyncLocal` 也能做 `ThreadLocal` 所做的事情吗?

我正在努力寻找简单的文档来说明其AsyncLocal<T>作用。

我写了一些测试,我认为这些测试告诉我答案是“是”,但如果有人能证实这一点那就太好了!(特别是因为我不知道如何编写对线程和延续上下文有明确控制的测试......所以它们可能只是巧合地工作!)


  • 据我了解,ThreadLocal将保证如果您在不同的线程上,那么您将获得对象的不同实例。

    • 如果您正在创建并结束线程,那么您最终可能会在稍后再次重新使用该线程(从而到达“该线程的”ThreadLocal对象已经被使用过的线程)。
    • 但与人的互动await却不太愉快。您继续的线程(即使)不能保证与您开始的线程相同,因此您可能无法从另一端.ConfigureAwait(true)返回相同的对象。ThreadLocal
  • 相反,AsyncLocal 确实保证您将在调用的两侧获得相同的对象await

但我找不到任何地方实际上说AsyncLocal将获得特定于初始线程的值,首先!

IE:

  • 假设您有一个实例方法 ( MyAsyncMethod),它在调用的任一侧引用其类中的“共享”AsyncLocal字段 ( ) 。myAsyncLocalawait
  • 假设您获取该类的一个实例并并行调用该方法多次。* 最后假设每个调用最终都安排在不同的线程上。

我知道,对于 ,的每次单独调用MyAsyncMethodmyAsyncLocal.Value将在等待之前和之后返回相同的对象(假设没有任何内容重新分配它)

但是否能保证每次调用首先都会查看不同的对象?


正如一开始提到的,我创建了一个测试来尝试自己确定这一点。以下测试一致通过

    public class AssessBehaviourOfAsyncLocal
    {
        private class StringHolder
        {
            public string HeldString { get; set; }
        }

        [Test, Repeat(10)]
        public void RunInParallel()
        {
            var reps = Enumerable.Range(1, 100).ToArray();
            Parallel.ForEach(reps, index => …
Run Code Online (Sandbox Code Playgroud)

c# multithreading thread-local-storage async-await

12
推荐指数
1
解决办法
6651
查看次数

通过日志来处理小概率

资料来源:Google Code Jam.https://code.google.com/codejam/contest/10224486/dashboard#s=a&a=1

我们被要求计算Prob(来自N次试验的K次成功),其中N次试验中的每一次都具有已知的p_n成功概率.

Code Jam之后给出了一些问题的分析和思考.

他们观察到,评估N次试验的所有可能结果将使你在N中呈指数时间,因此它们提供了一个很好的"动态编程"式解决方案,即O(N ^ 2).

设P(p#q)= Prob(p在第一次q试验后成功)然后观察以下事实:

Prob(p#q) = Prob(qth trial succeeds)*P(p-1#q-1) + Prob(qth trial fails)*P(p#q-1)
Run Code Online (Sandbox Code Playgroud)

现在我们可以建立一个P(i#j)表,其中i <= j,i = 1 ... N.

这一切都很可爱 - 我遵循所有这些并且可以实现它.


然后作为最后的评论,他们说:

In practice, in problems like this, one should store the logarithms of
probabilities instead of the actual values, which can become small
enough for floating-point precision errors to matter.
Run Code Online (Sandbox Code Playgroud)

我想我广泛理解他们想要做的事情,但我特别想不出如何使用这个建议.

采用上面的等式,并在一些字母变量中进行替换:

P = A*B + C*D
Run Code Online (Sandbox Code Playgroud)

如果我们想在Log Space中工作,那么我们有:

Log(P) = Log(A*B + C*D),
Run Code Online (Sandbox Code Playgroud)

在这里我们递归预先计算Log(B)Log(D),并 …

algorithm precision logarithm

10
推荐指数
1
解决办法
145
查看次数

为什么cancelledPromise模式被认为比React中的isMounted()"antipattern"更好?

请参阅:https ://reactjs.org/blog/2015/12/16/ismounted-antipattern.html 以及此处:如何取消对componentWillUnmount的获取并在此处:ismounted antipattern,track own property

在这两种情况下,他们提到了3种方

  • 在您的promise.resolve支票中this.IsMounted(),如果"已安装已卸载",React将为您正确返回
  • 在您的promise.resolve检查中_isMounted,您已在ComponentWillUnmount()方法中手动跟踪.
  • 使用可取消的承诺,以便您promise永远不会解决.这将解决你所有的问题并让它变得可爱.

除了,在第三种情况下你的promise遗嘱error(),但也可能error()在其他情况下(例如API已关闭).

所以实际上第3个选项可归结为: - 在您的promise.error检查中errorPayload.IsCancelled,您已在cancellablePromise对象中手动跟踪,而该检查又由手动调用触发ComponentWillUnmount.

所以这三个都完全相同:

处理promise结果时,请检查此变量的值,该值与组件是否已经存在直接关联unmounted.

为什么他们声称第3个选项比其他2更好,并且第1个选项是反模式.

javascript reactjs

10
推荐指数
1
解决办法
308
查看次数

在具有通配符Equatability的类上实现GetHashCode

假设我希望能够比较2个整数列表并将一个特定值视为外卡.

例如,如果-1是外卡,那么

{1,2,3,4} == {1,2,-1,4} //returns true

我正在编写一个类来包装所有这些逻辑,因此它实现IEquatable并具有相关的逻辑public override bool Equals()

但是,GetHashCode如果你压倒一切,我一直认为你或多或少必须实施.Equals().虽然它没有被编译器强制执行,但我一直认为如果你不这样做那么你做错了.

除非我不知道如何在.GetHashCode()不破坏合同的情况下实现(Equal的对象具有不同的哈希值),或者只是执行实现return 1.

思考?

c# wildcard hashcode iequatable

8
推荐指数
2
解决办法
565
查看次数

在Entity Framework Query中使用C#函数

在我的C#代码中,我有2个WHERE查询,我可以在IQueryable上调用它们,并将整个事务编译成SQL,并且这两个查询都有很多共同的逻辑.

我相信这不是这个类似问题的重复: 在实体框架查询的选择子句中使用函数,因为在我的场景中,有问题的函数可以转换为SQL - EF只是没有意识到它可以这样做.

查询大约是:

public static IQueryable<Template> WhereIsOwnedByUser(this IQueryable<Template> set, User user)
{
    return set.Where(temp =>
        temp.Requests
            .Where(req => req.WasSent)
            .OrderByDescending(req => req.DueDate)
            .Take(2)
            .SelectMany(req => req.RequestRecipients.Select(reqRecip => reqRecip.Recipient.Id))
            .Contains(user.Id));
}
Run Code Online (Sandbox Code Playgroud)

public static IQueryable<Template> WhereIsOwnedByUser(this IQueryable<DataReturn> set, User user)
{
    return set.Where(ret=>
        ret.Entity.Id == user.Entity.Id
        &&
        ret.Request.Template.Requests
            .Where(req => req.WasSent)
            .OrderByDescending(req => req.DueDate)
            .Take(2)
            .SelectMany(req => req.RequestRecipients.Select(reqRecip => reqRecip.Recipient.Id))
            .Contains(user.Id));
}
Run Code Online (Sandbox Code Playgroud)

因此,"拥有模板"的基本BusinessLogic规则,然后是"拥有DataReturn,如果公司匹配AND拥有模板"的必然结果

正如您所看到的,只考虑C#,这些可以很容易地重构为:

private static bool UserOwnsTemplate(User user, Template temp)
{
    return temp.Requests
               .Where(req => req.WasSent) …
Run Code Online (Sandbox Code Playgroud)

c# sql-server entity-framework function

8
推荐指数
1
解决办法
1097
查看次数

SELECT*FROM(VALUES(x,y))的名称AS TableLiteral(Col1,Col2)

以下是有效的SQL语法:

SELECT *
    FROM (VALUES ('p','q'),('x','y')) AS TableLiteral(Col1, Col2)
Run Code Online (Sandbox Code Playgroud)

并返回表:

  | Col1 | Col2
----------------
1 |  p   |  q
2 |  x   |  y
Run Code Online (Sandbox Code Playgroud)

这种语法可以进一步用于CTE等.

这有名字吗?我一直称它们为"TableLiterals",类似于字符串文字和正则表达式文字.

是否有一个将被广泛认可的术语.

t-sql sql-server terminology

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

使用.NET核心库csproj中的Selenium WebDriver

我正在尝试使用Selenium和.NET Core组建一个网络抓取应用程序,但是我无法找到我的WebDriver exe.

我有一个.csproj,它将运行项目的API,调用(以及其他)另一个将处理webscraping的.csproj.所有都在单个.sln中,并且都运行.NET Core 2.1

在刮凸出,我已经的NuGet安装Selenium.WebDriverSelenium.WebDriver.ChromeDriver.

我在API中创建了一个端点,它调用了抓取项目,并运行了一个尝试调用的方法new ChromeDriver().它不起作用:(具体来说,我得到:

The chromedriver.exe file does not exist in the current directory or in a directory on the PATH environment variable. The driver can be downloaded at ... <url>
Run Code Online (Sandbox Code Playgroud)

看起来相当清楚(虽然它令人失望并没有告诉你"当前目录"是什么意思.我将立刻提交PR)


通过观察重建期间的变化以及其他在线研究,我看到:

  • nuget包中的所有dlls和exes都存储在Global Nuget缓存中,而不是packages解决方案目录中的nuget 文件夹.
  • chromedriver.exe出现得到复制到<solutionFolder>\<ScrapingProjectFolder>\bin\Debug\chromeDriver.exe.
    • 我假设这是ChromeDriverNuget包的功能; 当然我自己没有配置它.
    • 对于ChromeDriver软件包而言,这表面看起来像是一个合理的事情,试图"安装这个以制作new ChromeDriver()JustWork".
  • 深入研究WebDriver代码库,发现它正在查看的"currentDirectory"是"的位置WebDriver.dll".
    • 在我的情况下,那是" <globalNugetPackagesCache>\selenium.webdriver\3.141.0\lib\netstandard2.0"
    • 似乎我不应该试图 …

c# selenium selenium-webdriver asp.net-core-2.0

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