Соединение не может быть выполнено, потому что целевая машина активно отказалась от нее 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, исключение и исключение)
Ответы
Ответ 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. Это решение, которое сработало для меня
- Убрал сборку
- перестраивать
Ответ 17
Введение:
Я столкнулся с такой проблемой, когда тестировал свое первое сетевое приложение.
Я создал: Клиент и Сервер, затем я запустил клиент, и внезапно возникло исключение, оно блокирует соединение, потому что порт не прослушивается!
Ошибка:
Мой порт не прослушивался сервером, поскольку сервер не работал.
Решение. Сначала запустите сервер, чтобы порт прослушивался сервером, и как только клиент попытается подключиться, сервер справится с этим.