WCF首先尝试:如何使BasicHttpBinding工作(客户端和服务器在同一台计算机上)

时间:2018-12-19 20:37:34

标签: c# wcf

  

由于目标计算机主动拒绝套接字,因此无法建立套接字连接

我从教科书(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();

在最后一行抛出一个异常,指出该连接“被主动拒绝”。

有人可以阐明这一点吗?

2 个答案:

答案 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
随时让我知道是否有什么可以帮助您的。