【问题标题】:WCF first try: How to make BasicHttpBinding work (client and server on same machine)WCF 第一次尝试:如何使 BasicHttpBinding 工作(客户端和服务器在同一台机器上)
【发布时间】:2018-12-21 09:47:44
【问题描述】:

由于目标机器主动拒绝,无法建立套接字连接

我为 WCF 服务和客户端实现了教科书(2008 年出版)中的样板代码。两者都在 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();

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

有人可以解释一下吗?

【问题讨论】:

    标签: c# wcf


    【解决方案1】:

    这可能是由于服务器/客户端之间的代理配置错误。我认为this 会有所帮助。

    【讨论】:

    • 它说 > 配置超文本传输​​协议 (HTTP) 代理服务器。但我没有代理服务器。并且:客户端和服务器都在同一台机器上运行
    • 嗯,其实我不仅“研究了书中的信息”,还研究了 StackOverflow 和 Googel 指出的其他地方的所有信息——但我真的不明白他们在说什么。
    • 好吧,真丢脸。服务器立即关闭......所以错误信息有点误导。 “主动拒绝”不是很正确。
    • 使用 (var host = new ServiceHost( typeof( Service1 ), new Uri( "localhost:8123/Service1"))) { host.AddServiceEndpoint( typeof( IService1 ), new BasicHttpBinding(), "Service1Http") ; host.Open(); Console.WriteLine("按终止服务主机"); Console.ReadLine(); }
    • 所以,两者之间的基本通信正常(感谢上帝...)
    【解决方案2】:

    是的,正如您所说,客户端需要在服务器自动关闭之前调用服务。您可以使用以下语句来防止服务器自动关闭。

    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,例如administrator。

    Netsh http add urlacl url=http://+:8123/ user=administrator
    

    +”是通配符,表示所有网卡请求都可以访问这个url。
    这是关于这个工具的官方文档。
    https://docs.microsoft.com/en-us/windows/desktop/Http/netsh-commands-for-http
    如果有什么可以帮助的,请随时告诉我。

    【讨论】:

    • 有趣。不知道,会调查的。谢谢!
    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 2011-11-20
    相关资源
    最近更新 更多