小编Sco*_*nen的帖子

具有不同身份验证标头的HttpClient单实例

鉴于.net HttpClient在设计时考虑了重用,并且意图存在很长时间,并且在短期实例中报告内存泄漏.在为多个用户调用端点时,您希望使用不同的承载令牌(或任何授权标头)对给定端点进行静默呼叫的指南行是什么?

private void CallEndpoint(string resourceId, string bearerToken) {
  httpClient.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("bearer", bearerToken);
  var response = await httpClient.GetAsync($"resource/{resourceid}");
}
Run Code Online (Sandbox Code Playgroud)

鉴于上述代码可以由Web应用程序上的任意数量的线程调用,第一行中设置的标头很可能与调用资源时使用的标头不同.

在不引起使用锁争用和维护无状态Web应用程序的情况下,为单个端点创建和部署HttpClients的建议方法是什么(我目前的做法是为每个端点创建一个客户端)?


生命周期

尽管HttpClient间接实现了IDisposable接口,但HttpClient的推荐用法并不是在每次请求后都将其处理掉.只要您的应用程序需要发出HTTP请求,HttpClient对象就会存在.在多个请求之间存在一个对象,可以设置一个用于设置DefaultRequestHeaders的地方,并且可以防止您在每次请求时重新指定CredentialCache和CookieContainer之类的内容,这是HttpWebRequest所必需的.

.net c# authorization oauth dotnet-httpclient

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

使用 Json.NET 进行不安全的反序列化

静态安全扫描器在这一行标记了我的 C# 代码:

var result = JsonConvert.DeserializeObject<dynamic>(response);
Run Code Online (Sandbox Code Playgroud)

response 将包含来自 Web API 的 JSON 响应。

扫描程序将此标记为“不安全的反序列化”。

有人可以帮助我了解如何利用它吗?Web 示例并不清楚漏洞利用是否可以在DeserializeObject方法本身内发生,或者仅在反序列化之后发生。

c# security json.net

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

如果Java程序员想要传递一个函数,他们在Java 8之前做了什么?

请温柔地对待我.

我听说Java 8引入了lambdas.但在此之前,如果你想传递一个函数,比方说,作为一个论点,你做了什么?

我能想到的一种方法是创建一个单一的方法接口,如下所示:

public interface ISingleMethodInterface
{
  bool Really(int n);
}

public bool GimmeFunction(ISingleMethodInterface interface, int n)
{
  return interface.Really(n);
}
Run Code Online (Sandbox Code Playgroud)

但这是作为一等公民的功能非常有限的应用,因为:

  1. 除了执行该函数或将该对象传递给另一个方法之外,您无法做很多事情.有了lambdas,你可以创作.例如,你可以像这样否定那个lambda:

    public bool GimmeLambdaAndIWillComputeItsInverse(Func<int, bool> predicate, int n)
    {
      return !predicate(n);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 你不能归还lambdas或他们的衍生物.我的意思是,你只能像这样返回同一个对象:

    // I know Java doesn't have Tuples but let's forget that for now
    public Tuple GimmeFunction(ISingleMethodInterface interface, int n)
    {
      return new Tuple { Item1 = interface, Item2 = n };
    }
    
    Run Code Online (Sandbox Code Playgroud)

    使用lambdas,您可以返回如下导数:

    public Func<int, bool> GetInverseFunction(Func<int, bool> predicate, int n)
    {
      return n …
    Run Code Online (Sandbox Code Playgroud)

java lambda programming-languages

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

如何使用Visual Studio 2017注册"自定义工具"以使其工作?

背景:我们有一个自定义工具,它接受xml输入并生成cs输出.自定义工具需要向 Visual Studio 注册才能使其与该版本的visual studio一起使用.

我们做了什么:我们已经使用Visual Studio 2015 完成了自定义工具注册,该工作正常.但现在问题出在Visual Studio 2017上.

问题:所以在我的研究到目前为止,我发现到Visual Studio的2015年,VS有哪些被允许注册工具直接注册表项,而是从VS 2017年,微软已经取得方式的变化注册表项如何存储(很好看的到了解VS2017中的变化).

如果我打开VS 2017并尝试运行自定义工具,那么我得到错误

在此系统上找不到自定义工具"工具名称".

在此输入图像描述

这是显而易见的,因为自定义工具尚未在VS 2017中注册工作.

我试图跟随这个说要将.bin文件加载到注册表的人,但他也说它禁止启动VS 2017.为了启动VS,我们必须卸载配置单元.研究表明,.bin文件可以根据安装的VS的类型(企业,专业等)在不同的位置.

有没有人这样做过?

TIA

c# registry customtool visual-studio-2017

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

困惑于SOLID和Dependecy Injection

所以我想学习SOLID原理和依赖注入.我已经阅读了一些关于这个主题的博客文章,我开始明白了一点.但是,有一种情况我无法找到答案,并会尝试在此解释.

我已经开发了一个用于文本匹配的库,它包含一个Matcher具有调用函数的类,该函数Match将结果返回给MatchResult对象.此对象包含百分比,已用时间,是否成功等信息.现在从我在依赖注入中理解的是,高级别的类不应该"知道"关于低级别的类或模块.所以我已经设置了我的库和Matcher类来使用类的接口Matcher,这将允许我使用IoC容器注册它.但是,因为该函数返回一个MatchResult对象,所以"高级类"必须知道MatchResult违反DI规则的对象.

我该如何解决这个问题,建议的方法是什么?

.net c# dependency-injection inversion-of-control solid-principles

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

Linq OrderBy不在If语句中工作

OrderBy子句的问题对排序没有任何影响.我已经在调试器中完成了这个工作,并确保这是一种情况,即代码的排序行被命中并且在订单之后查看结果尚未应用.

public static IEnumerable<DDLOptions<TValueType>> GetDDLOptionsViewModel<TClass, TValueType>(
            IEnumerable<TClass> list, 
            Func<TClass, TValueType> value, 
            Func<TClass, string> displayText,
            bool sort = true
        )
        {
            List<DDLOptions<TValueType>> ddlOptions;

            ddlOptions = list.Select(
                l => new DDLOptions<TValueType>
                        {
                            Value = value(l),
                            DisplayText = displayText(l)
                        }
                    ).ToList();  <========== Works if I put the Order By here.

            if (sort)
            {
                ddlOptions.OrderBy(l => l.DisplayText); <===== Does NOT work here.
            }

            return ddlOptions;
        }
Run Code Online (Sandbox Code Playgroud)

c# linq

4
推荐指数
2
解决办法
5014
查看次数

ConcurrentQueue .Net:多线程消费者

我有一个非常基本的问题,更多的是关于概念ConcurrentQueue.队列是FIFO.当多个线程开始访问它时,我们如何保证FIFO?假设,我已经加入Apple,Oranges,Lemon,PeachApricot-的顺序.第一个TryTake应该回来Apple.但是当多个线程开始提供自己的TryTake请求时会发生什么?当一个线程Lemon甚至可以在另一个线程返回之前返回时,是不是有可能Apple?我假设其他项目也将被返回,直到队列为空.但这些回报是否会围绕FIFO的基本原则进行管理?

.net c# multithreading concurrent-queue

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

具有相同元素的两个列表不相等.为什么?

我有以下内容:

  var a = new List<OrderRule> {
    new OrderRule("name", OrderDirection.Ascending),
    new OrderRule("age", OrderDirection.Descending)
  };


  var b = new List<OrderRule> {
    new OrderRule("name", OrderDirection.Ascending),
    new OrderRule("age", OrderDirection.Descending)
  };

  var r = a.Equals(b);
Run Code Online (Sandbox Code Playgroud)

即使两个列表包含彼此相等的项,r变量也是假的.OrdeRule类实现IEquality.请注意,当Direction和Property都相等时,两个OrderRules是相等的.

public enum OrderDirection { ASC, DESC }

public class OrderRule : IEquatable<OrderRule> {

  public OrderDirection Direction { get; }
  public String Property { get; }

  public OrderRule(String property, OrderDirection direction) {
    Direction = direction;
    Property = property;
  }

  public Boolean Equals(OrderRule other) {

    if (other == null)
      return …
Run Code Online (Sandbox Code Playgroud)

.net c#

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

为什么 ConcurrentQueue 和 ConcurrentDictionary 有“Try”方法 - TryAdd、TryDequeue - 而不是 Add 和 Dequeue?

ConcurrentQueueTryDequeue方法。

Queue就有Dequeue方法了。

没有ConcurrentDictionary方法Add,但我们有TryAdd

我的问题是:

这些并发收集方法有什么区别?为什么它们对于并发集合不同?

c# collections concurrentdictionary concurrent-queue

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

从类型名称获取可为空类型

我有以下场景,我得到一个如下所示的字符串

"System.DateTime?"
Run Code Online (Sandbox Code Playgroud)

或者

"int?"
Run Code Online (Sandbox Code Playgroud)

我希望能够做的是检索该字符串的 System.Type ,它看起来像:

{Name = "Nullable 1" FullName = "System.Nullable1[[System.DateTime, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"}

现在我知道如何从字符串中检索类型我可以Type.GetType("System.DateTime")在处理不可为空类型时或typeof(DateTime?)当我知道它将为 DateTime 为空时说,但在这种情况下,我不知道什么可以为空类型可能会出现并将只接收它作为字符串。

c# types nullable

4
推荐指数
2
解决办法
1338
查看次数