我正在开发一个创建和删除大量DOM的应用程序.我注意到尽管javascript堆内存保持不变,但浏览器选项卡中的进程内存不断增加.在测试应用程序中,我从父div创建并删除div.
<button onclick="createStuff()">Create</button>
<button onclick="deleteStuff()">Delete</button>
<div id="parent"></div>
function createStuff() {
var parentDiv = document.getElementById('parent');
for (var i = 0; i < 50000; i++) {
var child = document.createElement('div');
child.id = i;
child.textContent = i;
parentDiv.appendChild(child);
child = null;
}
parentDiv = null;
}
function deleteStuff() {
var parentDiv = document.getElementById('parent');
for (var i = 0; i < 50000; i++) {
var child = document.getElementById(i);
parentDiv.removeChild(child);
child = null;
}
parentDiv = null;
}
Run Code Online (Sandbox Code Playgroud)
我已经确认javascript堆没有泄漏与chrome dev工具(我是他们的新手所以我可能错过了一些东西).然而,该过程的记忆继续增加.从我读过的所有内容中,我怀疑移除的doms仍然在dom堆中.
其他帖子还说,浏览器最终会释放分配给删除的doms的内存.在上面的jsfiddle示例中,我多次点击创建和删除.我的javascript堆稳定在4.9MB.我的进程内存高达115MB.我等了30分钟,它根本没有下降.
问题
我正在探索使用ServiceStack作为WCF的替代方案.我的一个要求是服务器和客户端必须使用证书进行相互身份验证.客户端是一项服务,因此我无法使用涉及用户输入的任何类型的身份验证.此外,客户端需要能够使用单声道在Linux上运行,因此Windows身份验证已经完成.
我使用netsh.exe将服务器证书绑定到服务器端口,验证客户端是否获取服务器证书并使用wireshark加密数据.但是我不能为我的生活弄清楚如何配置服务器以要求客户端证书.
有些人建议使用请求过滤器来验证客户端证书,但这似乎非常低效,因为每个请求都会检查客户端证书.性能是非常重要的.创建自定义IAuthProvider似乎很有希望,但所有文档和示例都面向涉及用户交互的身份验证类型,而不是证书.
https://github.com/ServiceStack/ServiceStack/wiki/Authentication-and-authorization
是否可以使用证书通过自托管ServiceStack服务相互验证客户端和服务器?
这是我的测试服务供参考.
public class Host : AppHostHttpListenerBase
{
public Host()
: base("Self-hosted thing", typeof(PutValueService).Assembly)
{
//TODO - add custom IAuthProvider to validate the client certificate?
this.RequestFilters.Add(ValidateRequest);
//add protobuf plugin
//https://github.com/ServiceStack/ServiceStack/wiki/Protobuf-format
Plugins.Add(new ProtoBufFormat());
//register protobuf
base.ContentTypeFilters.Register(ContentType.ProtoBuf,
(reqCtx, res, stream) => ProtoBuf.Serializer.NonGeneric.Serialize(stream, res),
ProtoBuf.Serializer.NonGeneric.Deserialize);
}
public override void Configure(Funq.Container container)
{}
void ValidateRequest(IHttpRequest request, IHttpResponse response, object dto)
{
//TODO - get client certificate?
}
}
[DataContract]
[Route("/putvalue", "POST")]
//dto
public class PutValueMessage : IReturnVoid
{
[DataMember(Order=1)]
public …
Run Code Online (Sandbox Code Playgroud) 我正在排除配置页面中出现内存泄漏的问题.该页面用于更改我们的服务配置,还显示健康诊断.这意味着我们定期查询服务以获取配置和检测信息(通常我们使用30秒的查询间隔,但要排除故障,我以100毫秒的间隔查询).我们依靠knockoutjs,datajs,jquery和spinjs.
我发现,如果我以100毫秒的查询间隔让页面一夜之间打开,那么chrome浏览器选项卡的私有字节就会从大约50MB增加到335MB.我有四个问题的页面,但在我的故障排除工作中我专注于一个.使用chrome:// memory-redirect /我可以看到页面(进程ID 26148)内存.
但是,JavaScript堆内存在同一时期看起来是平坦的3.6MB.使用Chrome中的堆分析工具,它显示我的所有对象分配都是垃圾回收.
在上图中,灰色分配表明GC已清理了对象.
内存时间轴也是不变的.
我还强制要求两个GC,并确认两个GC之间的文档,节点和监听器的数量是不变的.
我的问题是:
感谢您的帮助!
我似乎无法找到发布的Microsoft.Owin.Security.Basic版本的NuGet包.我希望它能在nuget.org上,但事实并非如此.根据Katana项目网站,Microsoft.Owin.Security.Basic于2013年发布了v2.0.0.0.
https://katanaproject.codeplex.com/wikipage?title=roadmap
有谁知道我在哪里可以找到Microsoft.Owin.Security.Basic NuGet包或者至少发生了什么?
编辑
为了防止其他人遇到同样的问题,我只是将其发布到Katana项目中.
我有很多像这样的测试类.
[TestClass]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1001:TypesThatOwnDisposableFieldsShouldBeDisposable")]
public class TestClass
{
private IDisposable _disposable;
[TestInitialize]
public void TestInitialize()
{
_disposable = //new disposable object...;
}
[TestCleanup]
public void TestCleanup()
{
_disposable.Dispose();
}
[TestMethod]
public void Test1()
{
//Uses _disposable
}
[TestMethod]
public void Test2()
{
//Uses _disposable
}
[TestMethod]
public void TestN()
{
//Uses _disposable
}
}
Run Code Online (Sandbox Code Playgroud)
使用FxCop进行静态分析会导致以下警告,因为我没有在我的测试类上实现dispose模式.
"CA1001:拥有一次性田地的类型应该是一次性的"
现在我只是在源代码中抑制消息,但我觉得必须有一个更好的方法,而不是使用SuppressMessageAttribute来混乱我的所有测试.这似乎是测试中的常见模式 - 为测试创建对象,然后在测试后将其配置.我不能在测试类上实现IDisposable,因为只为所有测试方法创建了一个测试对象.我想在每个测试方法之间处理这个对象.
我知道我可以在每个测试中创建对象并将其配置在测试中,但我宁愿继续使用SuppressMessageAttribute复制并将相同的代码粘贴到每个测试方法中.这似乎是两个邪恶中较小的一个.是否有更好的方法在每次测试之前创建一次性对象,并在每次测试后处理它而不会导致警告CA1001?
我在这里先向您的帮助表示感谢.
我正在尝试使用C中的Qpid Proton编写AMQP 1.0客户端.我不想使用messenger.我想使用质子c引擎.我在弄清楚如何做到这一点时遇到了一些麻烦.我的主要关键点是为连接设置端点.使用我能找到的质子c引擎的C客户端的唯一例子就在这里.
https://github.com/apache/qpid-proton/blob/master/examples/engine/c/psend.c
但是,它使用的结构不属于Qpid Proton C API 0.12.0.具体来说,我没有看到pn_driver_t或pn_connector_t作为0.12.0 API的一部分.
我试图遵循AMQP 1.0规范中定义的一般工作流程1)创建连接,2)创建会话,3)创建发送者链接.我对C不太熟悉,这是我第一次使用Qpid Proton库的非信使部分,如果我错过了一些明显的东西,请原谅我.这是我目前的代码.我一直在尝试不同的选择并寻找好几天.
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include "proton/message.h"
#include "proton/messenger.h"
#include "proton/connection.h"
#include "proton/session.h"
#include "proton/link.h"
#include "proton/delivery.h"
#include "proton/event.h"
#include "proton/engine.h"
//State integer values are defined in Connection macros
//https://qpid.apache.org/releases/qpid-proton-0.12.0/proton/c/api/group__connection.html
void print_state(char * name, pn_state_t state)
{
printf("[%s] local: %i, remote: %i\n", name, PN_LOCAL_MASK & state, PN_REMOTE_MASK & state);
}
//Reference https://github.com/apache/qpid-proton/blob/master/examples/engine/c/psend.c
void send_engine()
{
struct pn_connection_t * connection;
connection = pn_connection();
//STACKOVERFLOW - I have …
Run Code Online (Sandbox Code Playgroud) 我正在使用WebAPI并将其与Katana托管在一起。我现在正在编写一些用于身份验证和授权的中间件。我必须对SSL使用基本身份验证,因为请求可能来自各种平台。目前还不能选择OAuth。中间件需要使用基本身份验证提供的用户名和密码,并验证用户是否是本地Windows组的成员。
现在,我正在尝试弄清楚如何创建WindowsPrincipal。如果我能弄清楚如何使用用户名和密码创建WindowsPrincipal,那么我会做其余的事情。这就是我现在所拥有的。
//TODO
WindowsPrincipal userPrincipal = null; //This is where I need to take the username and password and create a WindowsPrincipal
Thread.CurrentPrincipal = userPrincipal;
AppDomain.CurrentDomain.SetPrincipalPolicy(System.Security.Principal.PrincipalPolicy.WindowsPrincipal);
PrincipalPermission permission = new PrincipalPermission(null, "Local Group Name");
permission.Demand();
Run Code Online (Sandbox Code Playgroud)
我正在努力寻找一种使用用户名和密码来验证该成员是否属于特定组的好方法。做这个的最好方式是什么?我在这里先向您的帮助表示感谢。
我觉得我必须在这里错过一些简单的事情。我想使用JSON.parse将字符串转换为JSON对象。我一直在玩这个简单的例子。
JSON.stringify({hi:'"bye"'})
//returns "{"hi":"\"bye\""}"
JSON.parse(JSON.stringify({hi:'"bye"'}))
//returns Object {hi: ""bye""}
JSON.parse("{"hi":"\"bye\""}")
//returns SyntaxError: Unexpected identifier
JSON.parse('{"hi":"\"bye\""}')
//Unexpected token b
Run Code Online (Sandbox Code Playgroud)
我的问题是手动传递stringify返回与直接传递stringify返回以进行解析之间有什么区别?Mu的最终目标是能够将JSON字符串解析为JSON对象,其中的值可能包含双引号。
谢谢您的帮助。
c# ×4
javascript ×3
memory-leaks ×2
amqp ×1
c ×1
dispose ×1
dom ×1
fxcop ×1
html ×1
json ×1
katana ×1
memory ×1
owin ×1
qpid ×1
servicestack ×1
unit-testing ×1