Соединение не может быть выполнено, потому что целевая машина активно отказалась от нее 127.0.0.1:3446 - программирование
Подтвердить что ты не робот

Соединение не может быть выполнено, потому что целевая машина активно отказалась от нее 127.0.0.1:3446

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

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

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());
    }
}

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

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

в System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)        в System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket & socket, IPAddress & address, состояние ConnectSocketState, IAsyncResult asyncResult, время ожидания Int32, исключение и исключение)

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Выполнить → 'cmd' (как admin) и введите "iisreset"

Ответ 3

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

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

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

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

Ответ 4

Необходимо настроить системный прокси-сервер Вы должны пройти этот путь панель управления → интернет-опция → подключение → Настройки локальной сети → полномочие no tik: использовать прокси-сервер

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

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

См. здесь, как заставить его работать, не будучи пользователем admin: fooobar.com/questions/37901/...

Ответ 8

У меня была аналогичная проблема отклонение 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());

Ответ 9

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

Ответ 10

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

Ответ 11

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

Ответ 12

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

Внутреннее исключение: System.Net.Sockets.SocketException(0x80004005): соединение не может быть выполнено, потому что целевой компьютер активно отказался от него serviceIP: 443 в System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress) в System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket & socket, IPAddress & address, состояние ConnectSocketState, IAsyncResult asyncResult, исключение и исключение)

Разрешение: установите прокси в веб-конфигурации.

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

Ответ 13

Я также столкнулся с проблемой в .Net Remoting Service на С#.

Я решил его решить в 3 этапа:

  • Измените порт протокола во всех файлах, если он используется.
  • Запустите программу хост-сервера и активируйте ее.
  • Теперь запустите клиентскую программу.

Ответ 14

У меня была похожая проблема. В моем случае приложение VPN-прокси, такое как Psiphon, изменило настройки прокси-сервера в Windows, поэтому выполните следующие действия:

в Windows 10 выполните поиск, измените настройки прокси и отключите прокси-сервер в ручном прокси.

Ответ 15

Убедитесь, что включены все службы, используемые вашим приложением, которые используют хост и порт для их использования. Например, как в моем случае, эта ошибка может появиться, если ваше приложение использует сервер Redis и не может подключиться к нему через данный порт и хост, что приводит к этой ошибке.

Ответ 16

Я не мог перезапустить IIexpress. Это решение, которое сработало для меня

  1. Убрал сборку
  2. перестраивать

Ответ 17

Введение: Я столкнулся с такой проблемой, когда тестировал свое первое сетевое приложение. Я создал: Клиент и Сервер, затем я запустил клиент, и внезапно возникло исключение, оно блокирует соединение, потому что порт не прослушивается!

Ошибка: Мой порт не прослушивался сервером, поскольку сервер не работал.

Решение. Сначала запустите сервер, чтобы порт прослушивался сервером, и как только клиент попытается подключиться, сервер справится с этим.