System.ServiceModel.AddressAccessDeniedException:HTTP无法注册URL http :: 8080

use*_*348 24 c# asp.net wcf self-hosting wcf-binding

我创建了我的第一个自托管WCF服务.我在C#控制台应用程序中托管它,但它抛出一个错误:

System.ServiceModel.AddressAccessDeniedException:HTTP无法注册URL http:8080

当我以管理员身份运行Visual Studio 2013时,它运行良好,但如果不运行则不行.那么有什么方法可以自动完成它而不是将VS作为ADMIN启动?

到目前为止,我创建了一个HelloService类库,在其中我添加了一个WCF服务,该服务由一个接口IHelloServiceHelloService.

IHelloService:

namespace HelloService
{
    [ServiceContract]
    public interface IHelloService
    {
        [OperationContract]
        String GetMsg();
    }
}
Run Code Online (Sandbox Code Playgroud)

HelloService:

namespace HelloService
{
    public class HelloService : IHelloService
    {
        public String GetMsg()
        {
            return "Service Accessed";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个C#控制台应用程序HelloServiceHost,它有一个app.config文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors >
        <behavior name="MexBehaviour">
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service name="HelloService.HelloService" 
               behaviorConfiguration="MexBehaviour" >
        <endpoint 
            address="HelloService" 
            binding="basicHttpBinding" 
            contract="HelloService.IHelloService"></endpoint>
        <endpoint 
            address="HelloService" 
            binding="netTcpBinding" 
            contract="HelloService.IHelloService"></endpoint>
        <endpoint 
            address="mex" 
            binding="mexHttpBinding" 
            contract="IMetadataExchange"></endpoint>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8080/"/>
            <add baseAddress="net.tcp://localhost:8081/"/>
          </baseAddresses>
        </host>
      </service>
    </services>
  </system.serviceModel>
</configuration> 
Run Code Online (Sandbox Code Playgroud)

和program.cs文件:

using HelloService;
using System.ServiceModel;

namespace HelloServiceHost
{
    class Program
    {
        static void Main(string[] args)
        {
            using(ServiceHost sh = new ServiceHost(typeof(HelloService.HelloService)))
            {
                sh.Open();
                Console.WriteLine("Host Started @"+ System.DateTime.UtcNow.ToShortDateString());
                sh.Close();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我完全按照视频教程进行了操作但是为什么不工作呢?

我正在使用VS 2013,.net 4

小智 25

以管理员身份启动cmd并输入:

netsh http add urlacl url = http:// +:8080/MyUri user = DOMAIN\user

这对我有用.


小智 19

我在另一个项目上遇到了同样的问题.

问题是绑定到TCP端口需​​要管理权限.有几种方法可以解决这个问题.

  1. 保持管理命令提示符处于打开状 然后你可以直接运行控制台应用程序.

  2. (正如你的建议)以管理员身份运行VS. 仅在调试应用程序时,这是绝对必要的.

  3. 创建一个应用程序最明显的文件,指定requestedExecutionLevel level ="requireAdministrator".请参阅如何强制我的.NET应用程序以管理员身份运行?更多细节.


小智 7

在您的情况下,需要根路径URL(http:// +:8080 /)权限:

netsh http add urlacl url=http://+:8080/ user=%USERDOMAIN%\%USERNAME%
Run Code Online (Sandbox Code Playgroud)

显示所有URL保留:

netsh http show urlacl | FIND "URL"
Run Code Online (Sandbox Code Playgroud)