如何在没有管理员权限的情况下发布和连接到我自己的WCF端点

问题描述 投票:0回答:1

我在C#类库中实现了WCF REST API。最终,我希望该服务能够在我自己的进程中托管,或者作为Windows服务托管,具体取决于用户的选择。所以它需要支持inproc和HTTP绑定。

以下工作作为管理员,但不是普通用户(说它没有权限打开HTTP端口)。

我的下一步是什么?我应该在进程中使用不同的协议吗?只要我保留了在HTTP绑定上跨机器的能力,我很满意。

        WebServiceHost host = new WebServiceHost(typeof(SapphireServiceLib.SapphireService), new Uri("http://localhost:8080/") );
        try
        {
            ServiceEndpoint ep = host.AddServiceEndpoint(typeof(SapphireServiceLib.ISapphireService), new WebHttpBinding(), "");
            host.Open();
        }
        catch (Exception ex)
        {
            MessageBox.Show("Unable to start Sapphire Service Host: " + ex.Message);
            return;
        }

        // Next, connect to the endpoint for our own use

        try
        {
            // Set the max msg large, otherwise max size would be 64K and we couldn't fetch all the logs.
            // REVIEW I suppose this might expose it to a Denial of Service attack if public

            var binding = new WebHttpBinding() { MaxReceivedMessageSize = Int32.MaxValue };

            ChannelFactory<ISapphireService> cf = new ChannelFactory<ISapphireService>(binding, "http://localhost:8080");
            cf.Endpoint.Behaviors.Add(new WebHttpBehavior());
            SapphireService = cf.CreateChannel();
        }
        catch (Exception ex)
        {
            MessageBox.Show("Unable to connect to service endpoint: " + ex.Message);
            return;
        }
c# wcf
1个回答
0
投票

如果要保留http绑定,则必须使用netsh http add urlacl url=http://+80/YourService命令允许没有管理员权限的进程使用它。

另一种选择是切换到netTcpBinding。

© www.soinside.com 2019 - 2024. All rights reserved.