Win7/Vista/Server2008下VS 环境 调试调用 HTTP.SYS 没法启动监听服务及启动后其余机器没法访问端口

 

一. VS调试在Win7(vista系列)操做系统下 HttpListener没法绑定多个 指定IP、端口问题html

 

  

 

  来自:http://www.cnblogs.com/ryhan/p/4195693.html c#

 

  现象:System.Net.HttpListenerException (0x80004005): 拒绝访问。安全

  缘由:VS IDE 权限不够(生成的产物权限也会不够),提高UAC权限便可解决服务器

  步骤:网络

    1.选中对应Project,右键添加->新增应用程序清单文件 app.manifestapp

 

    

 

    2.将配置项 requestedExecutionLevel 的级别 asInvoker 改成 requireAdministratordom

 

    

 

    3.启动调试,会使用超级权限重启IDEtcp

 

    

 

    4.重启后,服务启动成功...    工具

         

    5.编译的exe文件会出现盾牌标识post

 

    

 

参考资料:

    http://blog.csdn.net/a316019667/article/details/8647237 --vs2005 中引入app.manifest(c#程序在win7下以管理员权限运行方法)

    http://www.tuicool.com/articles/BnE7jy --.NET中提高UAC权限的方法总结 - 大魔王mAysWINd

    http://tech.sina.com.cn/s/2009-12-10/07281168314.shtml --详解Visual Studio对应用程序的UAC设置

    http://www.cnblogs.com/wene/archive/2010/09/12/1824476.html --Visual studio 2008中添加manifest文件

    http://blog.csdn.net/nanchuan/article/details/8301310 --WIN7中HttpListener拒绝访问异常解决C# 

    

 

二. 在Win7(vista系列)已启动的HTTP服务,其余机器没法访问问题(或者没法以服务方式启动程序)

 

  现象:其余机器没法访问已启动的服务端口

  缘由:1.端口被防火墙隔离

     2.系统未监听对应的端口数据

     3.系统未将监听到的数据转发给对应的处理程序

  步骤:

    用管理员模式打开命令行:

 

    1. 输入如下指令 添加URL 访问控制列表

    netsh http add urlacl url=http://+:8080/ sddl="D:(A;;GX;;;LS)"

    2.输入如下指令 添加须要侦听的IP+端口

    netsh http add iplisten ipaddress=0.0.0.0:8080

    3.输入如下指令 添加防火墙规则(必选项)

    netsh advfirewall firewall add rule name="My Http Sev" dir=in action=allow protocol=TCP localport=8080

    完成以上步骤后,服务应该能够被其余机器访问了。

 

    参考资料:

    http://www.cnblogs.com/cmdszh/archive/2012/08/16/httplistener.html --WIN7中 HttpListener 拒绝访问 异常解决 C#
    http://www.cnblogs.com/jiewei915/archive/2010/06/21/1762066.html --WCF 部署问题 小总结 (HTTP 不能注册的解决方法)

 

 

----------------------------------------------------------分割线  如下部分为抄录----------------------------------------------------------------

源地址:http://www.cnblogs.com/jiewei915/archive/2010/06/21/1762066.html

 

但是工具写完,部署以后, 却出错了, Windows 服务 却没有启动。

当时缘由是不知道的,所以我是在 Windows  2008 R2 Core 下部署的,查看不了日志(为何要用 R2? 恩,由于我在Win 2008 Core下安装 .NET 3.5 的时候出错了~)

今天,又找了一下测试机,发现问题了

日志名称:          Application
来源:            DDNSHostService
日期:            2009/8/13 14:13:06
事件 ID:         0
任务类别:          无
级别:            错误
关键字:           经典
用户:            暂缺
计算机:           WPI2-PC
描述:
没法找到来自源 DDNSHostService 的事件 ID 0 的描述。本地计算机上未安装引起此事件的组件,或者安装已损坏。能够安装或修复本地计算机上的组件。

 

若是该事件产生于另外一台计算机,则必须在该事件中保存显示信息。

如下是包含在事件中的信息:

 

没法启动服务。System.ServiceModel.AddressAccessDeniedException: HTTP 没法注册 URLhttp://+:8080/。进程不具备此命名空间的访问权限(有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=70353)。 ---> System.Net.HttpListenerException: 拒绝访问。
   在 System.Net.HttpListener.AddAll()
   在 System.Net.HttpListener.Start()
   在 System.ServiceModel.Channels.SharedHttpTransportManager.OnOpen()
   --- 内部异常堆栈跟踪的结尾 ---
   在 System.ServiceModel.Channels.SharedHttpTransportManager.OnOpen()
   在 System.ServiceModel.Channels.TransportManager.Open(TransportChannelListener channelListener)
   在 System.ServiceModel.Channels.TransportManagerContainer.Open(SelectTransportManagersCallback selectTransportManagerCallback)
   在 System.ServiceModel.Channels.HttpChannelListener.OnOpen(TimeSpan timeout)
   在 System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   在 System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(TimeSpan timeout)
   在 System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   在 System.ServiceModel.ServiceHo...

在Windows 日志看到了这个错误,

网上查了一下,基本是权限问题。

 

实际上这个问题主要是因为使用了 HTTP 绑定引发的,由于系统中的 HTTP的注册由 HTTP.sys 管理。

因此,不是HTTP的应该没有这个问题。

 

解决方法给针对部署方式说明

若是是Windows程序, 通常 右键单击, 选择“以管理员方式启动” 既能够,包括VS调试的时候

若是是在IIS下,通常 是没有问题, WPA(Windows进程激活服务)/IIS7

通常是没有问题的,IIS自己就已经具备权限了

若是是Windows 服务(本文重点),可能须要配置一下了

做为一个WCF服务来说,若是用通常程序来HOST,做为最终产品,始终有点很差,(固然,这个是以服务端是服务器的前提下说的, 若是是那种P2P一类的程序就不是这个问题!)

在部署服务的时候,通常会选择一个系统账号,来运行服务

默认状况下, 若是使用的是本地系统帐户(Local system) 应该是没有问题的,

其余的2个帐户,可能就会遇到错误, 分别是 本地服务帐户(Local Service Account) 和 网络服务帐户(Network Service Account)

固然,你能够本身指定一个帐户,这里顺便说一下, 上边的3个帐户是没有密码的

 

下面说一下解决办法

一、用管理模式打开命令行

命令1 

 

netsh http add urlacl url=http://地址能够用+表示通用:端口/  sddl="D:(A;;GX;;;LS) user =domain\user

 

解释一下

netsh 是HTTP的配置工具 Vista 以上 自带, 以前的版本是HTTPCfg,在额外的工具包里

HTTP 是配置 HTTP相关的

add 是添加,也有其余操做 好比 删除 Delete  和 显示 Show

urlacl  就是最主要的了, URL ACL(URL 访问控制列表)

URL=  就是你要用到的地址,能够是域名 好比  abc.com 之类的,也能够用 + 表示通用, (也包含端口哦)

SDDL 是 安全描述定义语言(Security Descriptor Definition Language),一个很晦涩的东西,我也没有太懂。具体的能够参考后文连接。

这里解释一下上面写的。

D:(A;;GX;;;LS)

D: DACL 标记

A 表示 容许访问

GX 通常执行 权限

LS 本地服务帐户(Local service account)

另外还有

SY 本地系统帐户( Local system)

NS 网络服务帐户(Network service account)

若是不用这个预知的帐户,你可能须要输入 对应帐户的SID 才能够

User 表示 对应的用户, 和上边的最后一点差很少, 不过应该是用在自定义启动帐户上了。

 

例如, 容许 本地服务 注册 全部地址 的8080端口 的命令是

 

netsh http add urlacl url=http://+:8080/ sddl="D:(A;;GX;;;LS)"

 

这个成功的话,你应该能够启动服务。

接下来

命令2

 

netsh http add iplisten ipaddress=IP地址+端口

 

解释,前半服务和前边的相同。只说不一样的部分

ipListen  是IP侦听列表

ipaddress 是要侦听的IP地址+端口 (能够是IPV6地址)

 

例如: 监听全部地址的8080端口

 

netsh http add iplisten ipaddress=0.0.0.0:8080

 

接下来,添加防火墙规则, 若是你用的是Win2008以上的服务器,你须要配置一下系统防火墙,固然,你能够关掉。

命令3

 

netsh advfirewall firewall add rule name=名字 dir=in action=allow protocol=协议 localport=端口

 

解释:

advfirewall  是高级防火墙功能

firewall  就是防火墙

add  和前边的相同

Rule  是规则

Name 是规则的名字

Dir  是 数据方向,in 表示进入 out  表示 发出

action 是动做  有 allow 容许 和 block 阻止

protocol 是协议 能够是 0-255|icmpv4|icmpv6|icmpv4:type,code|icmpv6:type,code|tcp|udp|any (default=any) 通常是TCP

localport 就是本地使用的宽口号

 

例如,容许 HTTP 8080 端口 的外来访问, 规则的名字是 "DDNS Client Host Service"

 

netsh advfirewall firewall add rule name="DDNS Client Host Service" dir=in action=allow protocol=TCP localport=8080

 

 

这些完成后,基本程序就能跑了。外边的机器也应该能访问了

若是要删除的话,能够把 Add 换成 Delete  ,虽然有些小问题

 

---------

测试程序下载

---------

相关文章
相关标签/搜索