为了账号安全,请及时绑定邮箱和手机立即绑定

WCF 第一次尝试:如何使 BasicHttpBinding 工作

WCF 第一次尝试:如何使 BasicHttpBinding 工作

C#
慕神8447489 2022-06-19 16:52:31
由于目标机器主动拒绝,无法建立套接字连接我为 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();最后一行抛出异常,表示连接被“主动拒绝”。有人可以对此有所了解吗?
查看完整描述

2 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

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


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。

这是有关此工具的官方文档。

https://docs.microsoft.com/en-us/windows/desktop/Http/netsh-commands-for-http

如果有什么我可以帮忙的,请随时告诉我。


查看完整回答
反对 回复 2022-06-19
?
开满天机

TA贡献1786条经验 获得超13个赞

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



查看完整回答
反对 回复 2022-06-19
  • 2 回答
  • 0 关注
  • 135 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信