首先,我有ServiceStack作为我的服务器,它提供RESTful HTTP API.
这是一个例子.
public void GET(XXXXXRequest request)
{
System.Threading.Thread.Sleep(2000);
}
Run Code Online (Sandbox Code Playgroud)
然后我System.Net.Http.HttpClient
用来访问它.正如这里所说的, HttpClient
对于大多数方法来说,通过相同的TCP连接发送HTTP GET请求是线程安全的.
所以我有一个HttpClient的单例实例,如下所示
HttpClient _httpClient = new HttpClient(new WebRequestHandler()
{
AllowPipelining = true
});
Run Code Online (Sandbox Code Playgroud)
然后我使用以下测试代码在上一次响应之后发送请求
await _httpClient.SendAsync(request1, HttpCompletionOption.ResponseContentRead);
await _httpClient.SendAsync(request2, HttpCompletionOption.ResponseContentRead);
await _httpClient.SendAsync(request3, HttpCompletionOption.ResponseContentRead);
Run Code Online (Sandbox Code Playgroud)
在智能嗅探器中,我确实看到请求是通过一个连接发送的,它类似于:
Client -> Request1
Client <- Response1
Client -> Request2
Client <- Response2
Client -> Request3
Client <- Response3
Run Code Online (Sandbox Code Playgroud)
现在我将代码更改为fire-and-forget模式,如下所示.
_httpClient.SendAsync(request1, HttpCompletionOption.ResponseContentRead);
_httpClient.SendAsync(request2, HttpCompletionOption.ResponseContentRead);
_httpClient.SendAsync(request3, HttpCompletionOption.ResponseContentRead);
Run Code Online (Sandbox Code Playgroud)
这样就可以在不等待之前的响应的情况下发送请求,我希望请求和响应如下所示
Client -> Request1
Client -> Request2
Client -> …
Run Code Online (Sandbox Code Playgroud) 当我使用 netstat 时,我收到这样的信息 - PID 4 表示 HTTP.SYS
Active Connections
Proto Local Address Foreign Address State PID
TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4
TCP 10.140.126.48:80 10.140.126.139:57030 ESTABLISHED 4
TCP 10.140.126.48:80 10.140.126.181:57918 ESTABLISHED 4
TCP [::]:80 [::]:0 LISTENING 4
Run Code Online (Sandbox Code Playgroud)
因此,使用netsh
我可以接收有关 HTTP 层上特定侦听器的信息
netsh http show servicestate view=requestq verbose=no
Run Code Online (Sandbox Code Playgroud)
:
Snapshot of HTTP service state (Request Queue View):
-----------------------------------------------------
Request queue name: Other Application Pool
Version: 2.0
State: Active
Request queue 503 verbosity level: Limited
Max requests: 1000
Number of active …
Run Code Online (Sandbox Code Playgroud) 我想从另一台机器访问该站点,例如 192.168.1。11:10369
我找到了一个解决方案,即:http : //bendetat.com/access-iis-express-from-another-machine.html
如果我在Web Matrix 中 运行该项目,它运行良好,
但不能从Visual Studio 运行并显示错误错误请求.. http://prntscr.com/ifz2jq(但它作为http://localhost : 10369 / )
我该怎么做.. 以便它可以通过 IP 地址从VS工作,因为它在网络矩阵和本地主机/
kernelmode静态内容缓存是HTTP.SYS的一部分,配置起来非常简单.调试时,您始终可以使用以下命令检查kernelmode缓存的内容:
netsh http show cachestate
Run Code Online (Sandbox Code Playgroud)
但IIS中的用户模式缓存更难调试.似乎根本没有检查可能性.有没有一种简单的方法可以查看Web应用程序工作进程内的usermode缓存中的文件是什么?
在我们的项目中,我们有一个ISAPI模块,在将它们返回到浏览器之前对所请求的文件进行内省.因此,我们无法在IIS中使用标准的静态内容缓存.我们遇到缓存问题,IIS在短暂的预热期后停止向缓存添加新项目.项目被刷新,但似乎没有新文件被缓存.根据perfmon,缓存中的项目数量下降到少数.在任何给定时间能够准确查看缓存中的文件对我们来说非常有价值.
我已经将RavenDB 2.5.0安装为Windows服务.当我尝试以管理员身份运行Raven.Server.exe时,我会收到:
Trying to revoke rights for http.sys
runas netsh http delete urlacl url=https://+:8080/
Trying to grant rights for http.sys
runas netsh http add urlacl url=http://+:8080/ user="Endri-PC\Endri"
Failed to grant rights for listening to http, exit codes: (1 and 1)
A critical error occurred while starting the server. Please see the exception de
tails bellow for more details:
System.InvalidOperationException: Could not write to location: C:\RavenDB\Databa
se\System. Make sure you have read/write permissions for this path. ---> Microso
ft.Isam.Esent.Interop.EsentFileAccessDeniedException: Cannot access …
Run Code Online (Sandbox Code Playgroud) 我想大致了解一下 HTTP.sys 将请求转发到 IIS 7.0 及更高版本中的工作进程的方式。为此,我阅读了http://www.iis.net/learn/get-started/introduction-to-iis/introduction-to-iis-architecture 上的帖子。然而,这篇文章中有两点似乎是矛盾的,让我感到困惑。
第 1 点: “超文本传输协议栈 (HTTP.sys)”一节中提到的第二个要点如下。
内核模式请求队列。由于内核将请求直接转发到正确的工作进程,因此请求会导致上下文切换的开销较小。如果没有工作进程可用于接受请求,内核模式请求队列将保留该请求,直到工作进程接收它。
根据这一点,我的结论如下: HTTP.sys 绕过 WWW 服务将请求“直接”转发给工作进程。如果没有可用的工作进程,当 WAS 服务启动一个新的工作进程时,HTTP.sys 会将请求放入内核模式请求队列中。这个工作进程然后自己从内核模式队列中获取请求。
第2点: “Windows进程激活服务(WAS)”部分下的进程管理小节如下。
WAS 管理 HTTP 和非 HTTP 请求的应用程序池和工作进程。当协议侦听器接收到客户端请求时,WAS 会确定工作进程是否正在运行。如果应用程序池已经有一个为请求提供服务的工作进程,则侦听器适配器会将请求传递给工作进程进行处理。如果应用程序池中没有工作进程,WAS 将启动一个工作进程,以便侦听器适配器可以将请求传递给它进行处理。
根据这一点,我的结论如下: HTTP.sys 将请求“通过 WWW 服务”转发给工作进程,因为它是侦听器适配器。如果没有可用的工作进程,当 WAS 服务启动一个新的工作进程时,HTTP.sys 会将请求放入内核模式请求队列中。然后来自内核模式队列的请求被 WWW 服务接收并转发到工作进程。
任何人都可以让我知道我的上述两个结论中哪一个是正确的?如果两者都不正确,请告诉我正确的流程。
我正在构建一个C#控制台应用程序,它将:
[1.]生成自签名证书.
[2.]将其添加到个人(本地计算机商店)
[3.]最后使用netsh命令将该证书分配给计算机上的端口号.
到目前为止,我有部分[1.]和[2.]完美地工作,但在[3.]我受到无用且非正式的错误消息的困扰:
SSL证书添加失败,错误:1312指定的登录会话不存在.它可能已经被终止了.
当我查看微软有关此问题的官方网页时:https: //support.microsoft.com/en-us/kb/981506
它基本上告诉我这是一个Windows操作系统错误,我应该请求一个修补程序.
我的Hack解决这个问题的方法:
我能够最终绕过此错误的一种方法是打开IIS主页>打开"服务器证书"功能>然后导入我的.pfx证书.
通过将.pfx导入IIS,我似乎能够毫无困难地解决问题.我只需要按顺序运行这两个命令来生成.pfx
1.) C:\OpenSSL-Win32\bin>openssl req -x509 -sha256 -nodes -days 365 -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" -newkey rsa:2048 -keyout privateKey.key -out certificate.crt
2.) C:\OpenSSL-Win32\bin>openssl pkcs12 -export -out cert.pfx -inkey privateKey.key -in certificate.crt -passout pass:
因此,如果我现在将这两个命令运行到openssl,并通过IIS将它们导入我的个人本地计算机证书存储区,我就没有SSL Certificate add failed, Error: 1312
问题了.
但是,如果我以编程方式将新生成的证书添加到我的个人本地计算机证书存储区,那么我确实会收到错误:1312问题.
这是我的代码:
using CERTENROLLLib;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Text;
using System.Security.Cryptography;
using System.Diagnostics; …
Run Code Online (Sandbox Code Playgroud) 了解我的应用程序是在 Kestrel 还是 HTTP.sys 下运行的最佳方法是什么。到目前为止,我所发现的只是检查 HttpConext 属性类名称之一中是否有“Kestrel”。
在 MVC 控制器中我可以执行以下操作:
Boolean IsKestrel = HttpContext.Features.GetType().ToString().Contains("Kestrel");
Run Code Online (Sandbox Code Playgroud)
即检查这个:
Features = {Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1Connection<Microsoft.AspNetCore.Hosting.HostingApplication.Context>}
Run Code Online (Sandbox Code Playgroud)
使用 HTTP.sys 时我只得到:
Features = {Microsoft.AspNetCore.Http.Features.FeatureCollection}
Run Code Online (Sandbox Code Playgroud)
(这里的“Http”足以知道这是HTTP.sys吗?)
一定会有更好的办法。是否有一个明显的属性包含正在使用的主机的名称?
更广泛的问题可能是,我如何知道构建器模式构建了什么?
更新
找到了更好的东西,但仍在寻找具有服务器名称或类型的属性。
在 MVC 控制器中:
var isKestrel = HttpContext.Request.Headers.GetType().ToString().Contains(".Kestrel.");
var isHTTPsys = HttpContext.Request.Headers.GetType().ToString().Contains(".HttpSys.");
Run Code Online (Sandbox Code Playgroud) 我需要在Windows Azure上提升Http.sys注册表设置的UrlSegmentMaxLength .有谁知道怎么做?(或做一些导致等效行为的事情)
我有一个应用程序,它使用HttpListener
.Net 4.0中的类来为http请求提供服务.
在负载下,我注意到我得到了503 - QueueFull
- 日志中报告的错误.搜索此错误表示http.sys
在超过将排队的最大请求数时会发生此错误.
默认队列长度为1000.如果您使用IIS
它似乎可以通过应用程序池上的"高级设置"中的"队列长度"参数进行调整.
如果您不使用IIS,是否有任何方法可以调整此值?或者这个参数的控件是隐藏在HttpListener类中的,而不是暴露给开发人员?
无法理解这句话的意思.论坛上的人建议彼此在HTTP.sys中保留网址,但这是什么意思?它是为了什么?它是如何工作的?它全部来自HttpWebRequest uac问题.
与此问题相同的情况是,HttpListener没有收到远程请求,即使防火墙已关闭且所有前缀都已注册,即:
与其他问题的区别:
附加信息:
任何想检查或尝试的想法都是受欢迎的; 我几乎没有想法......
http.sys ×12
c# ×4
iis ×4
httplistener ×2
amazon-ec2 ×1
asp.net-core ×1
asp.net-mvc ×1
azure ×1
caching ×1
http ×1
iis-7 ×1
isapi ×1
netsh ×1
netstat ×1
networking ×1
openssl ×1
port ×1
ravendb ×1
ravendb-http ×1
registry ×1
servicestack ×1
was ×1
webmatrix ×1
windows ×1
winhttp ×1