Невозможно установить соединение, потому что целевая машина активно отказалась от него. 127.0.0.1:3446 - PullRequest
66 голосов
/ 14 марта 2012

Я использую шаблон 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 (логическое connectFailure, сокет s4, сокет s6, сокет и сокет, IP-адрес и адрес, состояние ConnectSocketState, IAsyncResult asyncResult, тайм-аут Int32, исключение и исключение)

Ответы [ 15 ]

130 голосов
/ 14 марта 2012

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

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

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

11 голосов
/ 05 апреля 2013

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

Выполнить -> 'cmd' (от имени администратора) и ввести "iisreset"

2 голосов
/ 27 ноября 2017

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

2 голосов
/ 30 ноября 2012

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

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

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

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

1 голос
/ 19 марта 2017

У меня была похожая проблема при отклонении 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());
1 голос
/ 05 апреля 2013

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

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

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

1 голос
/ 14 марта 2012

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

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

1 голос
/ 14 марта 2012

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

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

0 голосов
/ 21 марта 2019

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

0 голосов
/ 20 ноября 2018

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

в Windows 10, поиск изменить настройки прокси и прокси-сервер по очереди использования в ручном прокси

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...