簡體   English   中英

除非fiddler正在運行,否則HttpWebRequest不起作用

[英]HttpWebRequest doesn't work except when fiddler is running

這可能是我遇到的最棘手的問題。 我有一段代碼將POST提交到網址。 當fiddler沒有運行時,代碼不起作用也不會拋出任何異常。但是,當fiddler運行時,代碼會成功發布數據。 我可以訪問帖子頁面,所以我知道數據是否已經過POST。 這可能是非常無意義的,但這是我遇到的情況,我很困惑。

byte[] postBytes = new ASCIIEncoding().GetBytes(postData);
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://myURL);
req.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10";
req.Accept = "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
req.Headers.Add("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.3");
req.Headers.Add("Accept-Language", "en-US,en;q=0.8");
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = postBytes.Length;
req.CookieContainer = cc;
Stream s = req.GetRequestStream();
s.Write(postBytes, 0, postBytes.Length);
s.Close();

如果您不調用GetResponseStream()則無法關閉響應。 如果不關閉響應,那么最終會在.NET中處於錯誤狀態的套接字。 您必須關閉響應以防止干擾您以后的請求。

獲取后關閉HttpWebResponse

我有同樣的問題,然后我開始在每個請求后關閉響應,並且Boom,不需要讓fiddler運行。

這是同步代碼的偽:

request.create(url);

///codes

httpwebresponse response = (httpwebresponse)request.getresponse();

/// codes again like reading it to a stream

response.close();

我最近遇到了類似的問題。 除非Fiddler正在運行,否則Wireshark會顯示HTTPWebRequest不會離開客戶端計算機。 我嘗試刪除代理設置,但這並沒有解決我的問題。 我嘗試了從設置請求到HttpVersion.Version10,啟用/禁用SendChuck,KeepAlive以及許多其他設置。 這些都沒有奏效。

最后,我只是檢查.Net是否檢測到代理並讓請求嘗試忽略它。 這解決了我的問題request.GetResponse()拋出一個立即異常。

IWebProxy proxy = request.Proxy;

if (request.Proxy != null)
{
    Console.WriteLine("Removing proxy: {0}", proxy.GetProxy(request.RequestUri));
    request.Proxy = null;
}

在我的情況下,當我遇到相同的情況(POST僅在Fiddler運行時起作用)時,代碼從在IISExpress上運行的應用程序發送POST,在代理后面的開發環境中運行到外部服務器。 顯然,即使您在Internet選項中配置了代理設置,IIS運行的環境也可能無法訪問它們。 在我的工作環境中,我只需要使用代理配置腳本的路徑更新web.config。 您可能需要調整其他代理設置 在這種情況下,您的朋友是這個MSDN頁面,解釋它們是什么: http//msdn.microsoft.com/en-us/library/sa91de1e.aspx

最后,我在應用程序的web.config中包含以下內容,然后POST經歷了。

<configuration>
  <system.net>
    <defaultProxy>
      <proxy scriptLocation="http://example.com:81/proxy.script" />
    </defaultProxy>
  </system.net>
</configuration>

我遇到了與Python相同的問題 - 對本地服務器的請求失敗了404,但是當我用Fiddler運行它們時它們運行正常。

這里問題的真正線索是,Fiddler通過充當HTTP流量的代理來工作,以便來自本地機器的所有請求都通過Fiddler而不是直接進入網絡。

在我所處的確切情況下,我正在向本地服務器發出請求,常規流量通過代理和Local Area Network (LAN) Settings進行網絡連接Proxy server窗格選中“ Bypass proxy server for local addresses選項。

我懷疑是“本地地址的繞過代理服務器”不一定是編程語言,而是代理服務器的詳細信息。 Fiddler知道這個政策,所以通過Fiddler工作請求,但是直接來自編程語言的請求卻沒有。

通過將本地服務器請求的代理設置為空,它可以從代碼中正常工作。 顯然,如果您在部署期間發現自己從內部服務器遷移到外部服務器,那么這可能是一個難題。

好吧,幾個星期前我遇到了類似的問題,原因是當fiddler運行時它更改了代理設置以通過Fiddler傳遞請求但是當它關​​閉時代理仍然保留,因此不允許您的請求繼續互聯網。

我嘗試將IE和Firefox的網絡設置設置為不接受任何代理並且它有效。

試試這個,可能是同樣的問題......

我遇到了同樣的情況:我正在POST到Windows身份驗證后面的端點。

Fiddler保留了一個開放連接池 ,但是當它沒有fiddler運行時,你的C#test或powershell腳本就不會

因此,您可以通過在HttpWebRequest UnsafeAuthenticatedConnectionSharing屬性UnsafeAuthenticatedConnectionSharing設置為true來使test /腳本還維護一個打開的經過身份驗證的連接池。 在這里閱讀更多相關信息,microsoft KB 在該文章的兩個案例中,您都可以看到他們正在發出兩個請求。 第一個是獲取認證頭的簡單GET或HEAD(完成握手),第二個是POST,它將使用之前獲得的頭。

顯然你不能 (悲傷)直接與POST http請求握手。

我們在這里有一個非常相似的問題。 我們正在連接遠程服務,它們似乎幾乎總是失敗。 然而,當我們通過fiddler(來自網絡服務器)進行代理時,一切都運行得非常好。 我們正在努力調試,但是,聽起來這是一個非常類似的問題。

始終使用構造。 它確保所有資源在通話后釋放

   using (HttpWebResponse responseClaimLines = (HttpWebResponse)requestClaimLines.GetResponse())
                {
                    using (StreamReader reader = new StreamReader(responseClaimLines.GetResponseStream()))
                    {
                        responseEnvelop = reader.ReadToEnd();
                    }
                }

將以下條目添加到webconfig文件中

<system.net>
<connectionManagement>
<add address="*" maxconnection="30"/>

我找到了增加默認連接數的解決方案

ServicePointManager.DefaultConnectionLimit = 10000;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM