由于目标计算机主动拒绝套接字,因此无法建立套接字连接
我从教科书(2008年出版)中为WCF服务和客户端实现了样板代码。两者均在Windows 10下使用普通用户帐户(无管理员)在同一台计算机上运行。
我研究了书中的信息以找到解决此问题的方法,但我不理解他们在说什么。
using (var host = new ServiceHost(typeof(Service1), new Uri("http://localhost:8123/Service1")))
{
host.AddServiceEndpoint(typeof(IService1), new BasicHttpBinding(), "Service1Http");
host.Open();
}
这具有管理员权限(不好,但是第一次尝试可以)。
var ep = new EndpointAddress("http://localhost:8123/Service1/Service1Http");
var proxy = ChannelFactory<IService1>.CreateChannel(new BasicHttpBinding(), ep);
string s = proxy.SayHello();
在最后一行抛出一个异常,指出该连接“被主动拒绝”。
有人可以阐明这一点吗?
答案 0 :(得分:0)
这可能是由于服务器/客户端之间的代理配置错误。我认为this会有所帮助。
答案 1 :(得分:0)
是的,正如您所说,客户端需要在服务器自动关闭之前调用服务。您可以使用以下语句来防止服务器自动关闭。
class Program
{
static void Main(string[] args)
{
Uri uri = new Uri("http://localhost:13020");
BasicHttpBinding binding = new BasicHttpBinding();
binding.Security.Mode = BasicHttpSecurityMode.None;
using (ServiceHost sh=new ServiceHost(typeof(MyService),uri))
{
sh.AddServiceEndpoint(typeof(IService), binding, "");
ServiceMetadataBehavior smb;
smb = sh.Description.Behaviors.Find<ServiceMetadataBehavior>();
if (smb==null)
{
smb = new ServiceMetadataBehavior()
{
HttpGetEnabled = true
};
sh.Description.Behaviors.Add(smb);
}
Binding mexbinding = MetadataExchangeBindings.CreateMexHttpBinding();
sh.AddServiceEndpoint(typeof(IMetadataExchange), mexbinding, "mex");
sh.Opened += delegate
{
Console.WriteLine("service is ready...");
};
sh.Closed += delegate
{
Console.WriteLine("Service is closed now...");
};
sh.Open();
Console.ReadLine();
sh.Close();
}
}
}
仍然存在一个问题:如何让服务器在没有管理员权限的情况下运行?
您可以给您的应用程序帐户所需的权限。为此,我们为该帐户保留URL命名空间,从而允许相关应用程序注册该URL。我们可以使用 Netsh 命令(此工具需要管理员权限)。
Netsh http add urlacl url=http://+:8080/ user=domain\user
您应使用实际帐户代替 domain \ user ,并使用实际端口代替 8080 ,例如管理员。
Netsh http add urlacl url=http://+:8123/ user=administrator
“ + ”是通配符,表示所有网络适配器请求都可以访问此URL。
这是有关此工具的官方文档。
OpenJDK Life Cycle and Support Policy docs
随时让我知道是否有什么可以帮助您的。