2010-06-04 131 views
182

有時我在做WebService的HttpWebRequest時遇到以下錯誤。我也在下面複製了我的代碼。因爲目標機器主動拒絕,所以無法建立連接?


 
System.Net.WebException: Unable to connect to the remote server ---> System.Net.Sockets.SocketException: No connection could be made because the target machine actively refused it 127.0.0.1:80 
    at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress) 
    at System.Net.Sockets.Socket.InternalConnect(EndPoint remoteEP) 
    at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Int32 timeout, Exception& exception) 
    --- End of inner exception stack trace --- 
    at System.Net.HttpWebRequest.GetRequestStream() 

ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy(); 
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 

request.PreAuthenticate = true; 
request.Credentials = networkCredential(sla); 
request.Method = WebRequestMethods.Http.Post; 
request.ContentType = "application/x-www-form-urlencoded"; 
request.Timeout = v_Timeout * 1000; 

if (url.IndexOf("asmx") > 0 && parStartIndex > 0) 
{ 
    AppHelper.Logger.Append("#############" + sla.ServiceName); 

    using (StreamWriter reqWriter = new StreamWriter(request.GetRequestStream())) 
    {       
     while (true) 
     { 
      int index01 = parList.Length; 
      int index02 = parList.IndexOf("="); 

      if (parList.IndexOf("&") > 0) 
       index01 = parList.IndexOf("&"); 

      string parName = parList.Substring(0, index02); 
      string parValue = parList.Substring(index02 + 1, index01 - index02 - 1); 

      reqWriter.Write("{0}={1}", HttpUtility.UrlEncode(parName), HttpUtility.UrlEncode(parValue)); 

      if (index01 == parList.Length) 
       break; 

      reqWriter.Write("&"); 
      parList = parList.Substring(index01 + 1); 
     } 
    } 
} 
else 
{ 
    request.ContentLength = 0; 
} 

response = (HttpWebResponse)request.GetResponse(); 

回答

25

最可能的原因是防火牆。

This article包含一系列的原因。它可能對你有用。

從文章,可能的原因可能是:

  • FTP服務器設置
  • 軟件/個人防火牆設置
  • 多個軟件/個人防火牆
  • 防病毒軟件
  • LSP層
  • 路由器固件
  • 的COM帕特已關閉
  • 電腦未插入
+9

我的防火牆已關閉;但再次出現錯誤! – 2015-12-14 12:08:51

+7

我知道這是舊的,但你可以添加提琴手到這個列表。在應用程序啓動過程中分離提琴手,然後重新連接使我的插座正常工作。 – ps2goat 2016-09-02 18:52:13

+0

大拇指爲小提琴手 – 2017-12-02 12:55:04

144

如果發生這種情況總是,它的原意是指機器存在,但它沒有服務監聽指定的端口,或有防火牆阻止你。

如果是偶爾出現 - 你用這個詞「有時」 - 和重試成功,這可能是因爲服務器有一個完整的「積壓」。

當你正在等待accept編上一個監聽套接字,你被放置在一個積壓。這種積壓是有限的,而且非常短 - 值1,2或3並不罕見 - 因此操作系統可能無法排列您的請求以使'accept'消耗。

積壓是listen函數的一個參數 - 在這方面所有的語言和平臺都有基本相同的API,即使是C# one。如果您控制服務器並且可能從某些設置文件或註冊表中讀取此參數,則該參數通常是可配置的。調查如何配置您的服務器。

如果你寫的服務器,你可能有繁重的處理中接受你的插座,這樣就可以更好地轉移到一個單獨的工作線程所以你接受的是隨時準備接收連接。您可以探索各種架構選擇,以緩解排隊客戶端並按順序處理它們。

無論你是否可以增加服務器積壓,你確實需要重試邏輯在客戶端的代碼來處理這個問題 - 因爲即使長時間積壓的服務器可能會收到很多其他的請求在那個港口。

有一種難得的可能性,其中一個NAT路由器將使這個錯誤應該它是映射端口被耗盡。我認爲我們可以放棄這種可能性,因爲路由器在耗盡前有64K同時連接到相同的目的地址/端口。

+0

是的,我偶爾會得到它,並不總是,我不認爲理由是防火牆或其他任何東西,但積壓可能是這個問題的原因。無論如何解決這個問題? – hsnkvk 2010-06-04 08:58:55

+0

@hsnkvk;正確的方法是讓客戶端有一個重試循環;答案已更新相應 – Will 2010-06-04 09:18:10

+0

@ Will;我已經有一個iterationCount,如果失敗,我會重試iterationCount次。 :( – hsnkvk 2010-06-04 11:15:11

10

這也發生在我身上..有時當我打開我的項目時,這個錯誤顯示出來令人沮喪。問題在於有時Web服務的端口號意外改變。

當你有項目

我的項目在呼喚着與我的主要項目文件的Web.config文件中指定的特定端口號的Web服務的多個拷貝這個問題通常發生。由於端口號意外改變,瀏覽器無法找到Web服務並拋出該錯誤。

我解決了這個按照下面的步驟:(Visual Studio 2010中)

Go to Properties of the Web service project --> click on Web tab --> In Servers section --> Check Specific port and then assign the standard port number by which your main project is calling the web service.

我希望這將解決這個問題。

乾杯:)

+2

這對我來說不是常識。我一直困惑,爲什麼我的錯誤爲我指定了'LocalHost:2532'。事實證明,它是由你指定區域的前任所有者設置的。現在這個謎已經很清楚了,它讓其他一些事情變得不那麼神祕。謝謝! – Suamere 2014-03-17 16:45:25

0

我從引用位於從我的web層一個WCFHost服務收到此錯誤。對我有用的東西可能並不適用於每個人,但我會爲那些可能的人留下這個答案。我的WCFHost的端口號是由IIS隨機更新的,我只需在網絡配置中將最終路由更新爲svc引用。問題解決了。

2

我在使用AppFabric的應用程序中遇到此錯誤。線索在堆棧跟蹤中得到一個DataCacheException [1]。要查看這是否是您的問題,請運行以下PowerShell命令:

@(「AppFabricCachingService」,「RemoteRegistry」)| %{get-service $ _}

如果這兩個服務中的任何一個都停止了,那麼你會得到這個錯誤。

[1] http://msdn.microsoft.com/en-us/library/microsoft.applicationserver.caching.datacacheexception.aspx

+0

謝謝。作爲一個便箋,爲了將來參考我自己和其他人,它*出現*在我開始服務時工作,但該應用程序有各種緩慢,並且我終於在另一臺服務器上分配了(d'uh)服務, AppFabric集羣未打開。 – Mark 2015-03-02 23:45:42

0

在使用Windows 7家庭高級版64位WampServer 64位我遇到了這個確切的問題。經過數小時和數小時的實驗後,很明顯,所需要的只是在my.ini中註釋掉一行。然後它運行良好。

註釋掉1線 插座= mysql的

如果你把你的舊/數據/文件在適當的位置,WampServer將接受所有這些,除了它在寫入/ MySQL的/文件夾。因此,我只是從我以前的開發環境中導入了/ mysql/user數據的備份,並在phpMyAdmin SQL窗口中運行FLUSH PRIVILEGES。很棒。有些事情一定是錯的,因爲事情不應該這麼容易。

4

我有同樣的問題。問題是我沒有啓動硒服務器。我已經下載了硒服務器,我開始了。啓動硒服務器後,問題消失了,一切正常。

參見本:http://coding-issues.blogspot.in/2012/11/no-connection-could-be-made-because.html

+1

這個問題沒有提到有關硒服務器的任何內容。 – 2014-11-26 15:37:41

+1

@GeoffDawdy這只是[Will's answer](http://stackoverflow.com/a/2972662/2932052)的第一個理由的另一個例子 - 支持通過重複來學習;-) – Wolf 2015-09-28 09:17:09

2

嗯,我今天收到此錯誤在Windows 8 64位出藍色的,是第一次,而且事實證明我的my.ini已經復位, bin/mysqld文件已被刪除,其中"Program Files/MySQL/MySQL Server 5.6"文件夾中的其他項目也被刪除。

要修復它,我必須再次運行MySQL安裝程序,只安裝服務器,並複製我的最新版本。ini文件從"ProgramData/MySQL/MySQL Server 5.6",在我的情況下命名爲my_2014-03-28T15-51-20.ini(不知道如何或爲什麼最近複製到那裏)回到"Program Files/MySQL/MySQL Server 5.6"

自從MySQL工作以來,對系統的唯一改變是Native Instruments的Traktor 2和Traktor Audio 2聲卡的安裝,這實際上不應該導致這個問題,並且除了我以外沒有其他人使用過系統。如果任何人有線索,那麼你會評論一下,以防止我和任何遇到過這種情況的人。

+0

我有同樣的問題,並且需要解決它是通過services.msc停止MyQsl服務。但是,您的MySql在此之後不可用,因此您需要重新啓動計算機以再次使用它。 – Gabriel 2015-01-02 11:29:48

2

我使用Net TCP綁定與我的WCF服務有同樣的錯誤,但在我的情況下啓動下面的服務後解決。

Net.Pipe.Listener.Adapter

Net.TCP.Listener.Adapter

Net.Tcp端口共享服務

+1

輝煌,我把頭髮拉出來。腳註:在Windows 7 PC上運行我的WCF NET.TCP服務不需要運行這3項服務。但是,在Windows Server上運行(我測試過2003和2008),這些服務*已經運行WCF以便能夠更正。 – smirkingman 2015-05-05 12:46:48

4

我想,你需要檢查你的「互聯網選項」中的代理設置。如果您使用代理/'隱藏ip'應用程序,則可能會出現此問題。

+0

謝謝!我被困在這個太久了! – 2015-04-17 17:10:53

+0

這是典型的Windows 7問題嗎?與其他Windows版本相比,有些默認設置是否有所不同? – Wolf 2015-09-28 09:29:50

+0

@狼,我認爲這不是Windows的問題。但是,這可能是一個連接問題。 – isaeid 2016-11-17 22:06:17

1

用於解決方案中的服務參考。

  1. 重新啓動工作站

  2. 重建您的解決方案在WCFclient項目

  • 更新服務引用在這一點上,我收到消息話題(Windows 7)中,允許系統訪問。 然後服務參考已正確更新,沒有錯誤。

  • 2

    我想分享這個答案我找到了,因爲問題的原因不是防火牆或進程沒有正確聽,而是我使用的Microsoft提供的代碼示例。

    https://msdn.microsoft.com/en-us/library/system.net.sockets.socket%28v=vs.110%29.aspx

    我實現了這個功能幾乎完全一樣寫的,但發生的事情是,我得到這個錯誤:

    2016年1月5日12:00:48075 [10]錯誤 - 錯誤是: System.Net.Sockets.SocketException(0x80004005):無法建立連接,因爲目標機器主動拒絕它[4080 :: caa:745:a1da:e6f1%11]:4080

    此代碼會說套接字是連接,但不在實際正確通信所需的正確IP地址下。 (由微軟提供)

    private static Socket ConnectSocket(string server, int port) 
        { 
         Socket s = null; 
         IPHostEntry hostEntry = null; 
    
         // Get host related information. 
         hostEntry = Dns.GetHostEntry(server); 
    
         // Loop through the AddressList to obtain the supported AddressFamily. This is to avoid 
         // an exception that occurs when the host IP Address is not compatible with the address family 
         // (typical in the IPv6 case). 
         foreach(IPAddress address in hostEntry.AddressList) 
         { 
          IPEndPoint ipe = new IPEndPoint(address, port); 
          Socket tempSocket = 
           new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 
    
          tempSocket.Connect(ipe); 
    
          if(tempSocket.Connected) 
          { 
           s = tempSocket; 
           break; 
          } 
          else 
          { 
           continue; 
          } 
         } 
         return s; 
        } 
    

    我重寫了代碼,只是使用它找到的第一個有效IP。我只關心IPV4的使用情況,但它適用於本地主機,127.0.0.1以及您的網卡的實際IP地址,其中Microsoft提供的示例失敗!

    private Socket ConnectSocket(string server, int port) 
        { 
         Socket s = null; 
    
         try 
         { 
          // Get host related information. 
          IPAddress[] ips; 
          ips = Dns.GetHostAddresses(server); 
    
          Socket tempSocket = null; 
          IPEndPoint ipe = null; 
    
          ipe = new IPEndPoint((IPAddress)ips.GetValue(0), port); 
          tempSocket = new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 
    
          Platform.Log(LogLevel.Info, "Attempting socket connection to " + ips.GetValue(0).ToString() + " on port " + port.ToString()); 
          tempSocket.Connect(ipe); 
    
          if (tempSocket.Connected) 
          { 
           s = tempSocket; 
           s.SendTimeout = Coordinate.HL7SendTimeout; 
           s.ReceiveTimeout = Coordinate.HL7ReceiveTimeout; 
          } 
          else 
          { 
           return null; 
          } 
    
          return s; 
         } 
         catch (Exception e) 
         { 
          Platform.Log(LogLevel.Error, "Error creating socket connection to " + server + " on port " + port.ToString()); 
          Platform.Log(LogLevel.Error, "The error is: " + e.ToString()); 
          if (g_NoOutputForThreading == false) 
           rtbResponse.AppendText("Error creating socket connection to " + server + " on port " + port.ToString()); 
          return null; 
         } 
        } 
    
    3

    這真的是具體的,但如果你試圖連接到一個數據庫使用後,蒙哥收到此錯誤,什麼工作對我來說是蒙戈運行之前運行mongod.exe。然後連接工作正常。希望這可以幫助某人。

    +1

    它適用於我。感謝 – YeeKhin 2017-01-18 06:45:06

    0

    在我的情況,我有兩個應用:

    • 應用1
    • 應用2

    Assumption: App1 should listen to App2's activities on Port 5000

    Error: Starting App1 and trying to listen, to a nonexistent ghost town, produces the error

    Solution: Start App2 first, then try to listen using App1

    0

    我有這個問題經常發生。我發現SQL Server Agent服務未運行。一旦我手動啓動服務,它就會被修復。仔細檢查,如果該服務正在運行或不:

    1. 運行提示符下,鍵入services.msc並回車
    2. 查找服務名稱 - SQL Server Agent實例名稱

    如果SQL Server Agent沒有運行,請雙擊該服務以打開屬性窗口。然後點擊Start按鈕。希望它能幫助別人。

    2

    在我的情況下,一些域名有效,有些則沒有。在我的web.config中添加對我的組織的代理Url的引用修復了問題。

    <system.net> 
        <defaultProxy useDefaultCredentials="true"> 
         <proxy proxyaddress="http://proxy.my-org.com/" usesystemdefault="True"/> 
        </defaultProxy> 
    </system.net> 
    
    1

    我面臨着同樣的錯誤,因爲當你的服務器和客戶端同一臺機器上運行的客戶端需要服務器的本地IP地址不是公網IP地址,你只有在情況需要公網IP地址時,服務器和客戶端上運行與服務器進行通信單獨的機器,所以使用客戶端程序中的本地IP地址來連接服務器使用此方法可以找到本地IP地址。

    public static string Getlocalip() 
        { 
         try 
         { 
          IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName()); 
          return localIPs[7].ToString(); 
         } 
         catch (Exception) 
         { 
    
          return "null"; 
         } 
    
        } 
    
    +0

    這是我的場景:作爲替代解決方案,如果您指向解析爲公有IP的主機名,則可能還需要編輯您的服務器計算機的HOST文件並添加一條路由規則你的主機名爲127.0.0.1。 – Darkseal 2017-06-07 08:37:47

    0

    還有一個可能性 -

    確保您試圖打開相同的IP地址作爲你聽地方。我的服務器應用程序正在使用IPv6監聽主機的IP地址,但客戶端試圖連接主機的IPv4地址。

    2

    轉到您的WCF項目 - 屬性 - > Web - > 調試 - >取消標記的複選框

    Enable Edit and Continue

    +0

    謝謝。這個簡單的改變也解決了我的問題。 – 2017-05-23 12:16:01

    +0

    這很容易。解決了我的問題!謝謝。 – 2017-10-31 06:33:49

    0

    我遇到了這個錯誤,並花了一些時間來解決它。在我的情況下,我將https和net.tcp配置爲同一端口上的IIS綁定。很明顯,你不能在同一個端口上有兩件事情。我使用netstat -ap tcp命令來檢查是否有在該端口上偵聽的內容。沒有人在傾聽。刪除不必要的綁定(https在我的情況)解決了我的問題。

    0

    這是一個愚蠢的問題,我已經在我的web.config中添加了一個defaultproxy,以攔截Fiddler中的流量,然後忘記將其刪除!

    相關問題