我正在使用 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;
}
}
}
休息项目:
[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 窗体项目:用于测试
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());
}
}
我已关闭防火墙和 Internet 连接,但错误仍然存在。有没有更好的方法来测试上传方法?
堆栈跟踪:
在 System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress) 在 System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Int32 timeout,例外&例外)
8000
,但在您的错误消息中,端口是 3446
。这相关吗?
“主动拒绝它”意味着当您尝试连接时主机发送了重置而不是确认。因此,这在您的代码中不是问题。有防火墙阻止了连接,或者托管服务的进程没有在该端口上侦听。这可能是因为它根本没有运行,或者因为它正在侦听不同的端口。
启动托管服务的进程后,请尝试 netstat -anb
(需要管理员权限)以验证它是否正在运行并在预期的端口上侦听。
更新:在 Linux 上,您可能需要改为执行 netstat -anp
。
您不必重新启动 PC。而是重新启动 IIS。
运行 -> 'cmd'(以管理员身份)并输入“iisreset”
netstat -anb
时看到了端口,并且我还重新启动了服务器。还是同样的错误,有帮助吗?
iis
为我解决了这个问题。没有其他解决方案有效 这个被低估了!
我收到了类似的错误消息,例如 TCP 错误代码 10061:无法建立连接,因为目标机器在我当前的项目中主动拒绝了它。我发现这个 10061 错误代码无法区分服务端点未启动的情况和被防火墙阻止的情况。通常,可以关闭防火墙,但问题仍然存在。
您可以通过以下两种方式测试您的代码。
插入代码以获取服务启动的时间 A 和客户端向服务器发送请求的时间 B。如果 B 早于 A,则可能会导致此问题。将您的服务器端口更改为系统中也可用的另一个端口。您会发现报告了相同的错误代码。
以上是我的修复。它适用于我的机器。我希望它有帮助!
你必须设置你的系统代理你必须通过这个路径控制面板>>互联网选项>>连接>>局域网设置>>代理没有tik:使用代理服务器
检查是否有其他程序正在使用该端口。
如果同一程序的实例仍处于活动状态,则终止该进程。
我有一个类似的问题。就我而言,该服务在开发人员机器上可以正常工作,但在 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 服务中,您可能忘记注册该名称空间。没有很好地宣传这一步是必需的,实际上这样做很烦人。
我使用this tool to do this;它使所有这些繁琐的步骤自动化。
我在我的网络服务器上遇到了同样的问题“无法建立连接,因为目标机器主动拒绝了它 161.xx235:5672”。我要求管理员在 Web 服务器上打开端口 5672,然后它工作正常。
我在拒绝 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());
我在 C# 中的 .Net Remoting Service 中也遇到了问题。
我通过 3 个步骤解决了它:
更改正在使用的所有文件中的协议端口。运行您的主机服务器程序并使其处于活动状态。现在运行您的客户端程序。
我无法重新启动 IIexpress。这是对我有用的解决方案
清理构建重建
有了这个错误,我能够跟踪它,感谢@Yaur,您基本上需要检查服务(WCF)是否正在运行,并检查您的高级防火墙设置上的出站和入站 TCP 属性。
使用类似的模式,我的休息客户端正在调用服务 API,该服务在调试时成功调用,但不适用于已发布的代码。错误是:无法连接到远程服务器。
内部异常:System.Net.Sockets.SocketException (0x80004005):无法建立连接,因为目标机器主动拒绝它 serviceIP:443 at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress) at System.Net .ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& 套接字, IPAddress& 地址, ConnectSocketState 状态, IAsyncResult asyncResult, Exception& 异常)
解决方法:在 Web config 中设置代理。
<system.net>
<defaultProxy useDefaultCredentials="true">
<proxy proxyaddress="http://proxy_ip:portno/" usesystemdefault="True"/>
</defaultProxy>
</system.net>
我有一个类似的问题。在我的情况下,VPN 代理应用程序(例如 Psiphon ،)更改了 Windows 中的代理设置,因此请遵循以下步骤:
在 Windows 10 中,在手动代理中搜索更改代理设置和使用代理服务器
确保您的应用程序使用的所有服务都已打开,这些服务正在使用主机和端口来使用它们。例如,在我的情况下,如果您的应用程序正在使用 Redis 服务器并且无法在给定端口和主机上连接到它,则可能会出现此错误,从而产生此错误。
就我而言,我有一个带有 ASP.NET Core 的 Angular SLA 项目模板。
我试图从 Visual Studio WebUI 解决方案运行 IIS Express,触发“主动拒绝它”错误。
https://i.stack.imgur.com/JKNJf.png
在这种情况下,问题与阻止连接的防火墙无关。
事实证明,我必须独立于 Kestrel 运行来运行 Angular 服务器,因为服务器希望 UI 在特定端口上运行,但实际上并非如此。
有关详细信息,请查看官方 Microsoft documentation。
我有类似的问题。在launchSettings 中,我的IIS Express 配置在一个端口上,并且有另一个启动配置文件在另一个带有另一个端口的ApplicationUrl 上启动。
使用 IIS Express 配置文件启动 Web 应用程序导致我遇到错误。
我正在使用 Apache ActiveMQ Artemis AMQP 消息代理。在重新启动后尝试与代理发送和接收消息时,我开始收到“无法建立连接,因为目标机器主动拒绝它”异常。在同一类型的代理仍然工作的计算机上,netstat -anb 显示代理正在侦听预期的端口 5672。在出现错误的计算机上,代理没有侦听。在出现错误的计算机上,启动代理导致 Microsoft 事件查看器的“Windows 日志 > 系统”中出现以下警告:
The system failed to register host (A or AAAA) resource records for network adapter
with settings:
Adapter Name : {286EE2DA-3D81-41AE-VE5G-5D761FD3925E}
Host Name : mypc
Primary Domain Suffix : myco.com
DNS server list :
55.77.168.1, 74.86.130.1
Sent update to server : 186.952.335.157:45
IP Address(es) :
182.269.1.437
Either the DNS server does not support the DNS dynamic update protocol or the authoritative zone for the specified DNS domain name does not accept dynamic updates.
To register the DNS host (A or AAAA) resource records using the specific DNS domain name and IP addresses for this adapter, contact your DNS server or network systems administrator.
在具有管理权限的 cmd.exe 中运行以下命令、重新启动并等待大约 15 分钟后,我能够毫无错误地使用代理:
ipconfig /flushdns
ipconfig /renew
ipconfig /registerdns
netstat -anb
,我在列表中找不到端口。您知道解决此问题的一些可能步骤吗?我已经关闭了防火墙,禁用了防病毒软件并禁用了互联网连接,但仍然存在错误。-an b
是特定于 Linux 的。原始版本在 Windows 上运行良好(而您的更新版本则不行),这是大多数人用来开发 WCF 服务的平台。也就是说,我已经用 Linux 等价物更新了答案,因为这现在是 google 上与原始问题无关的事情的热门话题。