小编Tar*_*haf的帖子

在DLL接口中使用boost :: shared ptr可以吗?

在C++中开发一个返回boost共享指针并将它们用作参数的DLL是否有效?

那么,导出这样的函数是否可以?

1.) boost::shared_ptr<Connection> startConnection();
2.) void sendToConnection(boost::shared_ptr<Connection> conn, byte* data, int len);
Run Code Online (Sandbox Code Playgroud)

特别说明:引用计数是跨越DLL边界还是需要exe和dll使用相同的运行时?

目的是克服对象所有权的问题.所以当dll和exe都不再引用它时,对象会被删除.

dll boost memory-management shared-ptr

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

PHP/Amazon S3:查询字符串身份验证有时会失败

我在PHP中创建了一个简单的文件浏览器,通过生成过期的查询URL链接到文件.因此,对于对目录的每次访问,生成到每个文件的链接,该文件有效期为900秒.

我现在遇到的问题是生成的签名有时似乎失败了.这很奇怪,因为我故意使用外部S3库来生成URL和签名.

实际上,我尝试了以下库来生成签名:

库内部使用hash_hmac('sha256',...或hash_hmac('sha1',...) - 我也不明白为什么使用不同的哈希算法.

由于所有库的问题都是一样的,所以它也可以在我的URL生成代码中,但这很简单:

$bucket = "myBucket";
$filename = $object->Key;
$linksValidForSeconds = 900;
$url = $s3->get_object_url($bucket, $filename, $linksValidForSeconds);
Run Code Online (Sandbox Code Playgroud)

Sp $ bucket和$ linksValidForSeconds是常量,$ filename是例如"Media/Pictures/My Picture.png".但是对于相同变量的事件,它有时是有效的,因此不能.

有任何想法吗?

编辑:Typo /错误的常量变量名称已修复(谢谢)

php amazon-s3 digital-signature

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

序列化JSON字符串以匹配WCF服务功能参数

我正面临着在JSON中序列化对象以匹配WCF函数调用的参数名称的问题.问题是映射参数名称,即传入的JSON字符串应该具有与函数中传递的参数相同的起始值,例如

"{\"GetComplexDataResult\":{\"BoolValue\":true,\"StringValue\":\"Hello World!\"}}"
Run Code Online (Sandbox Code Playgroud)

这是我在我的客户端调用的WCF函数,你可以看到参数名称与返回的参数名称相同"GetComplexDataResult"

[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
String SaveData(CompositeType GetComplexDataResult);
Run Code Online (Sandbox Code Playgroud)

发生的问题是当我尝试使用Microsoft System.Web.Script.Serialization.JavaScriptSerializer或任何其他库(例如Json.NET)序列化我的对象时

它只返回我,{\"BoolValue\":true,\"StringValue\":\"Hello World!\"}即使我传递了同一类"CompositeType"的对象(这是客户端代码),例如

CompositeType GetComplexDataResult= new CompositeType();
GetComplexDataResult.BoolValue = true;
GetComplexDataResult.StringValue = "Hello World";

JavaScriptSerializer serializer = new JavaScriptSerializer();
string json = serializer.Serialize(patchVersion);
Run Code Online (Sandbox Code Playgroud)

我的问题是我如何获得这个JSON字符串

"{\"GetComplexDataResult\":{\"BoolValue\":true,\"StringValue\":\"Hello World!\"}}"
Run Code Online (Sandbox Code Playgroud)

代替

{\"BoolValue\":true,\"StringValue\":\"Hello World!\"}
Run Code Online (Sandbox Code Playgroud)

只需将我的对象传递给JSON解析器即可.我可以在生成JSON字符串后手动连接它,但这会花费太多时间来处理工作.有没有解决这个问题的解析器.

c# rest wcf json

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

通过右键单击任务栏阻止WinForms中的死锁

我的Windows C#/ .NET应用程序遇到了一个奇怪的问题.实际上它是一个GUI应用程序,我的工作是包含的网络组件,封装在一个程序集中.我不知道主/ GUI应用程序的代码,我可以联系它的开发人员.

现在,应用程序的UI具有"开始"和"停止"网络引擎的按钮.两个按钮都有效.为了使我的组件线程安全,我使用三种方法锁定.我不希望客户端能够在Start()完成之前调用Stop().另外还有一个轮询计时器.

我试着向你展示尽可能少的线条并简化问题:

private Timer actionTimer = new Timer(new
                TimerCallback(actionTimer_TimerCallback),
                null, Timeout.Infinite, Timeout.Infinite);

public void Start()
{
 lock (driverLock)
 {
  active = true;
  // Trigger the first timer event in 500ms
  actionTimer.Change(500, Timeout.Infinite);
 }
}

private void actionTimer_TimerCallback(object state)
{
 lock (driverLock)
 {
  if (!active) return;
  log.Debug("Before event");
  StatusEvent(this, new StatusEventArgs()); // it hangs here
  log.Debug("After event");
  // Now restart timer
  actionTimer.Change(500, Timeout.Infinite);
 }
}

public void Stop()
{
 lock (driverLock)
 {
  active = false; …
Run Code Online (Sandbox Code Playgroud)

.net c# deadlock winforms

5
推荐指数
1
解决办法
1821
查看次数

为什么这个 SocketException 没有被通用 catch 例程捕获?

我们公司为 GUI 应用程序提供网络组件 (DLL)。

它使用计时器来检查断开连接。如果它想重新连接,它会调用:

internal void timClock_TimerCallback(object state)
{
  lock (someLock)
  {
    // ...
    try
    {
         DoConnect();
    }
    catch (Exception e)
    {
        // Log e.Message omitted
        // Raise event with e as parameter
        ErrorEvent(this, new ErrorEventArgs(e));
        DoDisconnect();
    }
    // ...
  }
}
Run Code Online (Sandbox Code Playgroud)

所以问题是,在 DoConnect() 例程内部抛出了 SocketException(并且未被捕获)。我认为,catch(异常 e)应该捕获所有异常,但不知何故,SocketException 未被捕获并显示在 GUI 应用程序中。

protected void DoConnect()
{
    //
    client = new TcpClient();
    client.NoDelay = true;
    // In the following call the SocketException is thrown
    client.Connect(endPoint.Address.ToString(), endPoint.Port);
    // ... (login stuff)
}
Run Code Online (Sandbox Code Playgroud)

该文档确认 …

c# try-catch socketexception

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

如何扩展 OAuth2 主体

我们正在开发一个将 OAuth 2 用于两个用例的应用程序:

  1. 访问后端微服务(使用client_credentials
  2. 对应用程序的用户进行身份验证(使用authorization_code,因此将用户重定向到 Keycloak 进行登录,大致配置如教程中所示)。

在对用户进行身份验证时,我们从身份验证服务器接收部分信息(例如登录信息),另一部分可以在本地用户表中找到。我们想要做的是创建一个主体对象,其中还包含本地数据库中的数据。

PrimaryExtractor似乎是一条出路。由于我们必须使用手动 OAuth 配置才能不干扰 OAuth 用例 1,因此我们创建它并设置它:

tokenServices.setPrincipalExtractor(ourPrincipalExtractor);
Run Code Online (Sandbox Code Playgroud)

该实现基本上执行数据库查找并在映射函数中返回 CustomUser 对象。现在,虽然这似乎有效(调用提取器),但它没有正确地保留在会话中。因此,在我们的许多 REST 资源中,我们正在注入当前用户:

someRequestHandler(@AuthenticationPrincipal CustomUser activeUser) {
Run Code Online (Sandbox Code Playgroud)

并在那里接收 null 。查看注入的Authentication它表明它是一个OAuth2Authentication对象,具有默认的主体对象(我认为它是一个 Spring User/ UserDetails)。之所以为空,是因为它不是我们CustomUser之前返回的。

我们是否误解了工作方式PrincipalExtractor?这是否是我们的过滤器链配置错误,因为我们在同一个应用程序中有两种不同的 OAuth 机制(如前面提到的)?Spring 的主体存储库中的断点向我们展示了它CustomUser保存在那里,然后使用原始类型进行保存,这似乎覆盖了它。

java spring-security spring-security-oauth2 jhipster

5
推荐指数
1
解决办法
3405
查看次数

Delphi - 将DateTime Null保存到DB(ADO/MySQL)

我有一个带有一些数据库控件的Delphi表单.

为了表示一个日期,我使用了TJvDBDatePickerEdit(来自JCL),它有一个很好的属性

ShowCheckBox := True;
Run Code Online (Sandbox Code Playgroud)

允许用户输入没有已知日期(DBNull).

我验证,使DatePicker归零按预期工作:

procedure Tframe.adoQueryBeforePost(DataSet: TDataSet);
begin
  if (qryAuftraege.FieldByName('MyDateField').IsNull) then
  begin
    ShowMessage('IsNull!');
  end;
end;
Run Code Online (Sandbox Code Playgroud)

消息框显示.所以ADO组件应该写的字段是varNull类型.

现在有这个管道:

TADOQuery -> TADOConnection -> MS OLE DB Provider for ODBC Drivers -> MySQL ODBC 5.1 Driver
Run Code Online (Sandbox Code Playgroud)

MySQL ODBC驱动程序现在显示在它的日志中:

UPDATE `db`.`table` SET `MyDateField`=_latin1'0004-00-00' WHERE `ID`=5 AND `MyDateField`=_latin1'2009-06-17';
Run Code Online (Sandbox Code Playgroud)

好吧,日期存储为'0004-00-00'(MySQL似乎保存这样).现在在查询条目时,它被Delphi识别为Null,但是当它下次更新时,调用:

UPDATE `bvl`.`auftraege` SET `MyDateField`=_latin1'2009-06-17' WHERE `ID`=5 AND `MyDateField` IS NULL;
Run Code Online (Sandbox Code Playgroud)

当然失败了,因为MyDateField不是NULL(至少在MySQL DB中).

这个字符串'0004-00-00'来自哪里?如果它是某个地方的错误,我可以在哪里拦截它?

我已经知道有些组件可以提供直接的MySQL连接(我假设)没有显示这种行为.

mysql delphi odbc ado date

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

TcpListener停止接受或接受断开的连接

我们目前遇到在Windows上运行的自编服务器应用程序的问题(在不同版本上发生).服务器侦听TCP端口,接受连接,交换一些数据,然后再次关闭连接.大约有100个客户端不时连接.

有时服务器停止工作:日志文件显示仍然接受连接,但在第一次读取尝试时发生套接字错误(10054 - 由对等方重置连接).我不认为这是一个客户问题,因为它突然停止为所有客户工作.

现在我们发现,我们的旧服务器软件也出现了同样的问题,甚至用另一种编程语言编写.所以它在我们的程序中似乎不是一个错误 - 我认为它必须是某种操作系统/防火墙问题?当然,防火墙已经停用,但尚未解决问题.

任何想法在哪里研究?Wireshark日志即将推出..

摘自日志(时间戳,线程ID,消息)

11:37:56.137 T#3960 Connection from 10.21.13.3
11:37:56.138 T#3960 Client Exception: Socket Error # 10054
Connection reset by peer.
11:37:56.138 T#3960 ClientDisconnected
11:38:00.294 T#4144 Connection from 10.21.13.3
Run Code Online (Sandbox Code Playgroud)

您可以看到异常几乎在接受连接的同时发生,在这种情况下,客户端会在几秒钟后重新连接.

tcp serversocket

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

在99%只读的NHibernate Web应用程序中性能不佳

我目前正在调查ASP.NET MVC Web应用程序,据报道该应用程序在负载下性能较差.(但是加载只是每秒几个请求).

我们使用MySQL + NHibernate + Castle ActiveRecord进行映射.NHibernate会话在每个会话开始时打开,并在视图中保持打开状态.

我已经优化了数据访问模式,以避免在可能的情况下选择N + 1问题.

现在我正在考虑的是..在每个请求上打开一个数据库事务并在最后提交.在99%的请求(MVC操作)中,不必将数据写入数据库.

  1. 是否有可能,您是否在早期关闭会话/交易中看到了好处,甚至将会话标记为只读?
  2. 数据库锁定是否会成为瓶颈?如果是这样,是否可以明确地避免至少为只读事务锁定?

nhibernate performance castle-activerecord

-1
推荐指数
1
解决办法
729
查看次数