鉴于.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所必需的.
静态安全扫描器在这一行标记了我的 C# 代码:
var result = JsonConvert.DeserializeObject<dynamic>(response);
Run Code Online (Sandbox Code Playgroud)
response 将包含来自 Web API 的 JSON 响应。
扫描程序将此标记为“不安全的反序列化”。
有人可以帮助我了解如何利用它吗?Web 示例并不清楚漏洞利用是否可以在DeserializeObject方法本身内发生,或者仅在反序列化之后发生。
请温柔地对待我.
我听说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)
但这是作为一等公民的功能非常有限的应用,因为:
除了执行该函数或将该对象传递给另一个方法之外,您无法做很多事情.有了lambdas,你可以创作.例如,你可以像这样否定那个lambda:
public bool GimmeLambdaAndIWillComputeItsInverse(Func<int, bool> predicate, int n)
{
return !predicate(n);
}
Run Code Online (Sandbox Code Playgroud)你不能归还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)背景:我们有一个自定义工具,它接受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
所以我想学习SOLID原理和依赖注入.我已经阅读了一些关于这个主题的博客文章,我开始明白了一点.但是,有一种情况我无法找到答案,并会尝试在此解释.
我已经开发了一个用于文本匹配的库,它包含一个Matcher具有调用函数的类,该函数Match将结果返回给MatchResult对象.此对象包含百分比,已用时间,是否成功等信息.现在从我在依赖注入中理解的是,高级别的类不应该"知道"关于低级别的类或模块.所以我已经设置了我的库和Matcher类来使用类的接口Matcher,这将允许我使用IoC容器注册它.但是,因为该函数返回一个MatchResult对象,所以"高级类"必须知道MatchResult违反DI规则的对象.
我该如何解决这个问题,建议的方法是什么?
.net c# dependency-injection inversion-of-control solid-principles
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) 我有一个非常基本的问题,更多的是关于概念ConcurrentQueue.队列是FIFO.当多个线程开始访问它时,我们如何保证FIFO?假设,我已经加入Apple,Oranges,Lemon,Peach和Apricot-的顺序.第一个TryTake应该回来Apple.但是当多个线程开始提供自己的TryTake请求时会发生什么?当一个线程Lemon甚至可以在另一个线程返回之前返回时,是不是有可能Apple?我假设其他项目也将被返回,直到队列为空.但这些回报是否会围绕FIFO的基本原则进行管理?
我有以下内容:
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) ConcurrentQueue有TryDequeue方法。
Queue就有Dequeue方法了。
没有ConcurrentDictionary方法Add,但我们有TryAdd。
我的问题是:
这些并发收集方法有什么区别?为什么它们对于并发集合不同?
我有以下场景,我得到一个如下所示的字符串
"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 为空时说,但在这种情况下,我不知道什么可以为空类型可能会出现并将只接收它作为字符串。