我知道你们都会回答"使用像Fiddler这样的调试代理服务器",但事情并非那么简单.
这是我的情况:我有一些代码在服务器上运行,在ASP.NET页面代码隐藏(aspx.cs)中,其中(除其他外)建立与另一个服务器的连接,抓取一些东西,然后格式化它并将其返回给浏览器.
问题是其他服务器做错了,所以我希望能够将调试标志传递到页面中(通过查询字符串,例如?debug = true),这样它就会打印出完全原始的 HTTP请求它发送到其他服务器所以我可以看到什么是错的.这段代码在几个地方运行,所以我希望能够在dev,staging或production上传递这个标志,只看到请求,而不必弄清楚生产服务器是否可以与某处存在的代理服务器通信等
你会认为这样做很容易,对吧?所以我觉得我疯了或者别的什么,但我查看了HttpWebRequest及其父类WebRequest的参考资料 - 什么都没有.没有办法.你会认为微软会想到这一点.最接近的是你可以访问"Headers"集合,但是当我尝试它时,它省略了一些非常重要的标题,如"内容长度" - 所以它必须"撒谎"给我(我知道它在撒谎,因为我知道因为远程服务器返回200状态 - 请求成功,它只返回错误/不同/错误的数据)
这是ask-for代码示例:
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://www.whatever.com");
req.Method = ... whatever ...;
... other setup for the request ...
/* At this point we are about to send the request.
What does the raw HTTP request look like? */
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
Run Code Online (Sandbox Code Playgroud) 似乎有很多令人困惑的,有时是冲突的信息,关于使.net HTTPListener https能够.我的理解如下:
一个人的c#代码需要一个https前缀(例如https://*:8443),以便监听器理解它需要在此端口上为SSL请求提供服务.
实际的SSL握手发生在幕后并由http.sys(安装在Windows机器上的某处)进行处理; C#代码不必显式管理ssl握手,因为它发生在封面下.
需要在计算机上安装"x509可信证书" httpListener,并且某种程度上证书需要绑定到端口8443(在此示例中)
我的理解是否正确?如果没有,请教育我.
关于x509证书,我的理解是:
makecert创建X509证书.此证书存储在个人存储中,需要转移到可信存储(这是http侦听器所在的位置).似乎我可以certMgr用来执行移动,或者我可以mmc用来实现移动.似乎还有超过1 X509证书格式(DER,Base64,pks,PSWD保护pks私有等)..有,我应该使用首选格式?一旦我将证书带入可信商店,我就需要将它绑定到tcp端口.我在Win7上:我应该使用httpcfg还是netsh?
任何提示/建议将不胜感激.
我正在编写一个系统托盘应用程序,需要检查基于内部网络的应用程序是否已打开.
我可以使用以下方法检查IE:
SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindows();
string filename;
bool sdOpen = false;
foreach (SHDocVw.InternetExplorer ie in shellWindows)
{
filename = Path.GetFileNameWithoutExtension(ie.FullName).ToLower();
if (filename.Equals("iexplore"))
{
string[] urlParts = (ie.LocationURL.ToString()).Split('/');
string website = urlParts[2];
if (website == "myApp:8080") { sdOpen = true; };
}
}
if (sdOpen) { Console.WriteLine("App is open"); } else { Console.WriteLine("App is not open"); };
Console.ReadKey(true);
Run Code Online (Sandbox Code Playgroud)
但是,部分使用该系统的用户更喜欢使用Chrome或Firefox.
如何为Chrome和Firefox执行与上述相同的操作(即获取浏览器中任何打开的标签的网址)?(我不会打扰其他浏览器,因为这些是我们组织中唯一使用的浏览器.)
我正在阅读这个问题(如何在C#中创建一个简单的代理?),这几乎是我的意愿.
我只想要开发ac#app,例如,监控Firefox,IE等,并记录所有导航页面.根据访问过的页面,我想阻止该网站(如父母过滤器).
代码片段/样本很好,但如果您能告诉我使用该类的方向,我将不胜感激.:-)
所以我在我的笔记本电脑上在线玩游戏,这是一个非常简单的 html5 游戏,但优化并不存在。我的屏幕上有几个圆圈的游戏使用了我 85% 的 CPU。
从逻辑上讲,我开始分析游戏并试图弄清楚是否可以为我的笔记本电脑优化它。现在,我想知道如何运行游戏但使用正在运行的 JS 脚本的调整版本。
如果我尝试保存页面并从我的笔记本电脑上运行它,它当然有 CORS 问题,所以我无法访问服务器。
我可以以某种方式稍微更改在我的浏览器中执行的脚本,但同时仍停留在正在运行的“网页内”,以便我可以正常地向服务器发出 XHR 请求?
另外,虽然这不在问题的标题中,但我能否以某种方式将 XHR 请求代理到我的脚本,同时又不违反 CORS 规则?
如果我从浏览器和桌面上保存的 HTML 运行相同的东西,为什么会如此不同?我有相同的 IP 并且正在做同样的事情,但从 url 来看,它“感觉就像”我正在从其他地方运行它。我可以以某种方式模仿我正在“从网页”运行,而是从修改后的保存的 html 运行它吗?
我正在实现一个代理操作方法,该方法转发传入的Web请求并将其转发到另一个网页,添加一些标头.动作方法为GET请求工作文件,但我仍然在努力转发传入的POST请求.
问题是我不知道如何正确地将请求主体写入传出的HTTP请求流.
这是我到目前为止的缩短版本:
//the incoming request stream
var requestStream=HttpContext.Current.Request.InputStream;
//the outgoing web request
var webRequest = (HttpWebRequest)WebRequest.Create(url);
...
//copy incoming request body to outgoing request
if (requestStream != null && requestStream.Length>0)
{
long length = requestStream.Length;
webRequest.ContentLength = length;
requestStream.CopyTo(webRequest.GetRequestStream())
}
//THE NEXT LINE THROWS A ProtocolViolationException
using (HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse())
{
...
}
Run Code Online (Sandbox Code Playgroud)
一旦我在传出的http请求上调用GetResponse,我就会收到以下异常:
ProtocolViolationException: You must write ContentLength bytes to the request stream before calling [Begin]GetResponse.
Run Code Online (Sandbox Code Playgroud)
我不明白为什么会发生这种情况,因为requestStream.CopyTo应该负责编写正确数量的字节.
任何建议将不胜感激.
谢谢,
阿德里安
c# ×4
asp.net ×2
.net ×1
asp.net-mvc ×1
blocking ×1
client-side ×1
debugging ×1
firefox ×1
html ×1
http ×1
httplistener ×1
javascript ×1
monitoring ×1
proxy ×1
url ×1
webrequest ×1