Не удалось установить соединение, т. к. конечный компьютер отверг запрос на 127.0.0.1:3446

Я использую WCF4.0 шаблон -остальное. Я пытаюсь создать метод, который загружает файл с помощью потока.

проблема всегда возникает при

Stream serverStream = request.GetRequestStream();

класс для потоковой передачи:

namespace LogicClass
{
    public class StreamClass : IStreamClass
    {
        public bool UploadFile(string filename, Stream fileStream)
        {
            try
            {
                FileStream fileToupload = new FileStream(filename, FileMode.Create);
                byte[] bytearray = new byte[10000];
                int bytesRead, totalBytesRead = 0;
                do
                {
                    bytesRead = fileStream.Read(bytearray, 0, bytearray.Length);
                    totalBytesRead += bytesRead;
                } while (bytesRead > 0);

                fileToupload.Write(bytearray, 0, bytearray.Length);
                fileToupload.Close();
                fileToupload.Dispose();
            }
            catch (Exception ex) { throw new Exception(ex.Message); }
            return true;
        }
    }
}

проект REST:

[WebInvoke(UriTemplate = "AddStream/{filename}", Method = "POST", BodyStyle = WebMessageBodyStyle.Bare)]
public bool AddStream(string filename, System.IO.Stream fileStream)
{
    LogicClass.FileComponent rest = new LogicClass.FileComponent();
    return rest.AddStream(filename, fileStream);
}

проект Windows Form: для тестирования

private void button24_Click(object sender, EventArgs e)
{
    byte[] fileStream;
    using (FileStream fs = new FileStream("E:stream.txt", FileMode.Open, FileAccess.Read, FileShare.Read))
    {
        fileStream = new byte[fs.Length];
        fs.Read(fileStream, 0, (int)fs.Length);
        fs.Close();
        fs.Dispose();
    }

    string baseAddress = "http://localhost:3446/File/AddStream/stream.txt";
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(baseAddress);
    request.Method = "POST";
    request.ContentType = "text/plain";
    Stream serverStream = request.GetRequestStream();
    serverStream.Write(fileStream, 0, fileStream.Length);
    serverStream.Close();
    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
    {
        int statusCode = (int)response.StatusCode;
        StreamReader reader = new StreamReader(response.GetResponseStream());
    }
}

Я отключил брандмауэр и подключение к Интернету, но ошибка все еще существует. Есть ли лучший способ тестирования загрузки метод?

трассировка стека:

в системе.Сеть.Розетки.Розетка.DoConnect (конечная точка endPointSnapshot, socketAddress socketAddress) в системе.Сеть.ServicePoint.ConnectSocketInternal (Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, состояние ConnectSocketState, iasyncresult asyncResult, время ожидания Int32, исключение и исключение)

13 ответов


"активно отказался" означает, что хост отправил сброс вместо ack при попытке подключения. Поэтому это не проблема в коде. Либо брандмауэр блокирует соединение, либо процесс, в котором размещается служба, не прослушивает этот порт. Это может быть потому, что он не работает вообще или потому, что он слушает на другом порту.

Как только вы начнете процесс размещения вашего сервиса, попробовать netstat -anb (требуются права администратора), чтобы убедиться, что он работает и прослушивает ожидаемый порт.

update: в Linux вам может потребоваться сделать netstat -anp вместо.


вам не нужно перезагружать компьютер. Вместо этого перезапустите IIS.

Run - > 'cmd'(как admin) и введите "iisreset"


Я получил аналогичное сообщение об ошибке, как код ошибки TCP 10061: соединение не может быть выполнено, потому что целевая машина активно отказалась от него в моем текущем проекте. Я считаю, что этот код ошибки 10061 не может отличить случай, когда конечная точка службы не запущена, и случай, когда она заблокирована брандмауэром. Часто брандмауэр можно отключить, но проблема все еще существует.

вы можете проверить свой код двумя способами.

  1. вставить код, чтобы получить время, что служба запущена и время Б, что клиент отправляет запрос на сервер. Если B раньше, чем A, это может вызвать эту проблему.
  2. измените порт сервера на другой порт, который также доступен в системе. Вы найдете тот же код ошибки сообщается.

это исправить. Он работает на моей машине. Надеюсь, это поможет!


Проверьте, использует ли этот порт какая-либо другая программа.

Если экземпляр той же программы все еще активен, убейте этот процесс.


У меня была аналогичная проблема. В моем случае служба будет работать нормально на машине разработчика, но потерпит неудачу, когда на машине QA. Оказалось, что на машине QA приложение не запускалось от имени администратора и не имело разрешения на регистрацию конечной точки:

HTTP не удалось зарегистрировать URL http://+: 12345 / Foo.svc/]. Ваш процесс не имеют прав доступа к этому пространству имен (см. http://go.microsoft.com/fwlink/?LinkId=70353 относительно деталей.)

см. здесь, как заставить его работать, не будучи пользователем администратора:https://stackoverflow.com/a/885765/38258


Если вы используете WCF storm, можете ли вы даже войти в конечную точку службы WCF? Если нет, и вы размещаете его в службе Windows, вы, вероятно, забыли зарегистрировать это пространство имен. Это не очень хорошо рекламируется, что этот шаг требуется, и это на самом деле раздражает.

Я использую этот инструмент для этого; он автоматизирует все эти громоздкие шаги.


у меня была похожая проблема отвергая localhost и 127.0.0.1. cmd (admin) netstat -anb нашел порт, работающий на 169.254.80.80 (не знаю, что ip пришел, потому что мой сетевой ip был 10.0.0.5. после ввода этого IP он работал. Это дает правильный IP:

IPAddress ipAddress = ipHostInfo.AddressList[0];
Console.WriteLine(ipAddress.ToString());

проверьте номер порта в файле Web.конфигурация вашей веб-страницы такая же, как та, которая размещена на IIS.


с этой ошибкой я смог отследить его, благодаря @Yaur, вам нужно в основном проверить службу (WCF), если она запущена, а также проверить исходящие и входящие свойства TCP в настройках брандмауэра advance.


У меня была такая же проблема на моем веб-сервер "не удалось установить соединение, т. к. конечный компьютер отверг 161.х.х.235:5672". Я попросил администратора открыть порт 5672 на веб-сервере, тогда он работал нормально.


с аналогичным шаблоном мой клиент rest вызывает API службы, служба успешно вызывается при отладке, но не работает над опубликованным кодом. Ошибка: не удалось подключиться к удаленному серверу.

Внутреннее Исключение: Система.Сеть.Розетки.SocketException (0x80004005): не удалось установить соединение, поскольку целевая машина активно отказалась от него serviceIP:443 at System.Сеть.Розетки.Розетка.DoConnect (EndPoint endPointSnapshot, SocketAddress socketAddress) в Системы.Чистая.Менеджмент.ConnectSocketInternal(логическое connectFailure, гнездо С4, С6, гнездо, разъем и гнездо, IP-адрес и адрес, государственный ConnectSocketState, объекта iasyncresult asyncresult, к, исключение& исключение)

разрешение: установите прокси в web config.

<system.net>
    <defaultProxy useDefaultCredentials="true">
      <proxy proxyaddress="http://proxy_ip:portno/" usesystemdefault="True"/>
    </defaultProxy>
</system.net>

необходимо настроить системный прокси Ты должен пройти этот путь. панель управления>>интернет>>подключения>>настройка сети>> полномочие нет tik: использовать прокси-сервер


Я также столкнулся с проблемой в Службе удаленного взаимодействия .Net в C#.

Я получил его решение в 3 шага:

  1. изменить порт протокола во всех файлах, где он используется.
  2. запустите программу хост-сервера и сделайте ее активной.
  3. теперь запустите клиентскую программу.