我使用作为自托管进程运行的Web API创建了REST资源.出于性能原因,我希望能够使用持久HTTP连接来调用它.我使用OWIN自托管.
我非常喜欢System.Net.Http.HttpClient中的GET,POST,PUT,DELETE的asnyc方法.它们很容易调用和处理 - 它们返回一个System.Threading.Tasks.Task,这对我正在尝试做的事情很方便.我更喜欢使用HttpClient来进行System.Net.HttpWebRequest.
我可能遗漏了一些东西,但我不清楚如何使用HttpClient创建持久连接.我正在挖掘System.Net.Http.HttpClientHandler和System.Net.Http.WebRequestHandler类,但到目前为止,我还没有找到持久连接的选项.Google找到了使用HttpWebRequest创建持久连接的各种示例.它有一个KeepAlive属性,可以设置为true.有没有办法用HttpClient设置它?
默认情况下,HttpWebRequest将用于向服务器发送请求.可以通过在其中一个构造函数重载中指定不同的通道来修改此行为,并将HttpMessageHandler实例作为参数.如果需要身份验证或缓存等功能,可以使用WebRequestHandler配置设置,并将实例传递给构造函数.可以使用HttpMessageHandler参数将返回的处理程序传递给构造函数重载之一.
有没有办法在底层的HttpWebRequest上设置KeepAlive功能?
MSDN文档还说:
HttpClient类实例充当发送HTTP请求的会话.HttpClient实例是应用于该实例执行的所有请求的设置集合.此外,每个HttpClient实例都使用自己的连接池,将其请求与其他HttpClient实例执行的请求隔离开来.
我是否可以从中了解到,当可以获得性能优势时,连接池将使用持久连接为我优化?如果我想在那里只与客户建立一个连接怎么办?
*更新*
答案非常有用,现在我的代码正在返回ERROR_SUCCESS.关键的变化似乎是转向使用SetKernelObjectSecurity().但是,现在我看到了一个不同的问题; 我的代码成功,但如果我查看文件系统或在代码中检查文件,它仍然有以前的所有者.
之前已经报道了SO,但没有一个令人满意的答案.
这是我的代码的公开要点.它增加了一些输出,所以你可以看到我在说什么.您应该能够将它添加到空的Visual Studio C++控制台项目并通过它进行调试.务必使用"以管理员身份运行"打开Visual Studio.
*第二次更新*
我刚刚在MSDN上找到了这个注释SetKernelObjectSecurity().
注意 在文件系统对象上设置安全描述符时,不应使用此函数.相反,使用
SetSecurityInfo或SetNamedSecurityInfo功能.
我不确定我是怎么错过的......它就在顶部.
*原始问题*
我需要fchown()在Windows上实现相同的功能,但经过相当多的研究和努力后,我一直无法使其工作. fchown()更改通过打开的文件描述符指定的文件的所有权.对于Windows,这可以是打开的文件描述符,也可以是HANDLE(您可以从另一个创建一个).似乎无论我尝试什么,我都会得到ERROR_ACCESS_DENIED.
我曾经尝试都SetSecurityInfo()和SetUserObjectInfo().我可以使用相应的Get*函数从打开的文件描述符中获取所有权信息:GetSecurityInfo()和GetUserObjectSecurity().
当我重新编写代码以使用SetNamedSecurityInfo()或者SetFileSecurity(),在指定文件名而不是打开HANDLE的情况下,一切正常.
我是否遇到过操作系统的低级文件系统访问控制规则?
是否无法在Windows上更改打开文件的所有权?
据我所知,当HANDLE打开时,我甚至无法更改DACL. 当我认为我已经保护文件但有人仍然有一个打开的HANDLE时,Windows是否只是试图阻止我的虚假安全感?
在我看来,如果我错过了某些东西,那可能就是我的呼唤方式CreateFile().
期待可能发布的一些答案:
(另外,请记住,我只需将Win32 API的对象版本替换为带有文件名的对象版本)
AdjustTokenPrivileges()给自己SE_TAKE_OWNERSHIP_NAMECreateFile()的dwShareMode.这是一些代码.我删除了所有错误处理,以便这个问题不会太长:
wchar_t* filename = L"test.txt";
HANDLE hFile = …Run Code Online (Sandbox Code Playgroud) 我是Cassandra的新手,仍然试图围绕内部工作.
我正在考虑在一个只有少量节点(少于10个,最常见的是3个)的应用程序中使用Cassandra.理想情况下,我的集群中的每个节点都将拥有所有应用程序数据的完整副本.所以,我正在考虑将复制因子设置为簇大小.添加其他节点时,我会更改键空间以增加复制因子设置(nodetool修复以确保它获取必要的数据).
我将使用NetworkTopologyStrategy进行复制,以利用有关数据中心的知识.
在这种情况下,分区实际上如何工作?我已经读过在Cassandra中形成环的节点和分区键的组合.如果我的所有节点都对每个数据"负责"而不管分区器计算的哈希值,我是否只有一个分区键的环?
这种类型的Cassandra部署是否有巨大的挫折?我猜测会在后台进行大量异步复制,因为数据传播到每个节点,但这是设计目标之一,所以我很好.
读取的一致性级别通常可能是"一"或"local_one".
写入的一致性级别通常为"2".
使用标准解决方案忽略证书验证后,Invoke-RestMethod返回:
Invoke-RestMethod : A system error occurred and has been logged. Please try again later or contact your administrator.
Run Code Online (Sandbox Code Playgroud)
我今天刚刚注意到这个失败,所以我认为它与Powershell更新有关.通过"标准解决方案"我的意思是:
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = { $true }
Run Code Online (Sandbox Code Playgroud)
几个月前停止工作,并在C#类型中正确设置回调添加到Powershell(历史记录中的描述).
这是我的环境:
> $PSVersionTable
Name Value
---- -----
PSVersion 5.1.15063.674
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.15063.674
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
Run Code Online (Sandbox Code Playgroud)
这是一个小历史,所以这个问题不仅仅是一个副本关闭.
如果你谷歌或搜索StackOverflow你可以找到这个问题提出一些预制的回应.但是,今天我注意到所有的标准解决方案都不再适用了.
Powershell给出的标准错误是:
Invoke-RestMethod : The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.
Run Code Online (Sandbox Code Playgroud)
在所有论坛上给出的标准答案是在你打电话之前使用这个命令Invoke-RestMethod: …
CMake版本2.8.9
我正在为Windows 8编写一个在平板电脑上运行的应用程序.我编写了一个包含大部分应用程序逻辑的底层C++库.我正在使用CMake来编译这个C++库,因为我想为未来的端口建立一个独立于平台的构建系统.
当我从命令行运行cmake.exe或使用cmake-gui时,我可以使用"Visual Studio 11"和"Visual Studio 11 Win64"生成器生成项目.但是,当我尝试使用"Visual Studio 11 ARM"生成器时,我收到以下错误:
CMake Error at C:/Program Files (x86)/CMake 2.8/share/cmake-2.8/Modules/CMakeTestCCompiler.cmake:52 (MESSAGE):
The C compiler "cl" is not able to compile a simple test program.
Run Code Online (Sandbox Code Playgroud)
原因在于更详细的输出:
1>------ Build started: Project: cmTryCompileExec2764216458, Configuration: Debug ARM ------
1>C:\Program Files
(x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Platforms\ARM\PlatformToolsets\v110\Microsoft.Cpp.ARM.v110.targets(36,5):
error MSB8022: Compiling Desktop applications for the ARM platform is not supported.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Run Code Online (Sandbox Code Playgroud)
默认情况下,"Visual Studio 11 ARM"生成器似乎不起作用,因为cl.exe不允许CMake测试编译器.
我已经读过,我可以完全关闭编译器检查,但这听起来像是一个糟糕的选择.这只是CMake中的一个错误吗?
此代码在Xcode的早期版本中编译.我更新了Xcode,现在编译失败了.我猜我的代码有问题.下面代码中的问号是根据ISO-8859-1(0xF6)编码的o-umlaut(ö) - 我们用来调用这个上部(或扩展)ASCII.我猜测编译错误与转换为clang的UTF-8输入编码有关?
$ xcrun -sdk macosx10.8 -run clang -v
Apple LLVM version 4.2 (clang-425.0.24) (based on LLVM 3.2svn)
Target: x86_64-apple-darwin12.2.0
$ cat test.c
#include <stdio.h>
int main( int argc, char** argv )
{
fprintf( stderr, "?\n" );
return 0;
}
$ xcrun -sdk macosx10.8 -run clang -o test test.c
test.c:4:23: warning: illegal character encoding in string literal [-Winvalid-source-encoding]
fprintf( stderr, "<F6>\n" );
^~~~
1 warning generated.
Run Code Online (Sandbox Code Playgroud) 我最近在Windows 8上进行了很多实验,使用用C++/CX编写的WinRT组件编写C#XAML Metro风格的应用程序,以获得更好的性能,并使用C#中没有的功能,特别是DirectX.
在我的WinRT组件中从我的应用包中加载资源时,我的应用程序抛出了以下内容:
TestResources.exe中0x0fd58ae3(MSVCR110D.dll)的未处理异常:0xC0000409:0xc0000409.
我试图对新的StorageFile API进行异步调用(Windows :: Storage :: StorageFile :: GetFileFromApplicationUriAsync链接到其他调用来读取文件内容)并使用concurrency :: task.get()同步生成的任务链.
它似乎没有起作用.如果我没有调用concurrency :: task.get()或concurrency :: task.wait(),那么问题就不会发生,但由于我的DirectX代码的编写方式,我需要同步结果.
c ×2
rest ×2
.net ×1
arm ×1
ascii ×1
c# ×1
c++-cx ×1
cassandra ×1
clang ×1
cmake ×1
directx ×1
partitioning ×1
powershell ×1
replication ×1
ssl ×1
utf-8 ×1
web-services ×1
winapi ×1
windows ×1
windows-10 ×1
windows-8 ×1
winrt-xaml ×1
xcode4.6 ×1