Vista下调式WCF的http服务的安全问题
今天在Vista下开发了一个WCF的Tcp程序,跑的很正常,突然想公开一下Http接口,按WCF的文档说明,应该没有问题的,但是非常令人气氛的说服务进程没有权限打开端口,具体错误信息类似:System.ServiceModel.AddressAccessDeniedException:HTTP 无法注册 URL http://+:8000/ServiceModelSamples/service/。进程不具有此命名空间的访问权限(有关详细信息,请参见 http://go.microsoft.com/fwlink/?LinkId=70353)。---> System.Net.HttpListenerException:访问被拒绝
msdn上提了三个步骤来解决这个问题:1.如果计算机不是域成员,请将身份验证模式和保护级别设置为 None 以禁用传输安全性,如下面的示例配置所示:确保通过设置终结点的 bindingConfiguration 属性将终结点与绑定关联。
确保在运行示例前更改 PoisonMessageServer、服务器和客户端上的配置。
2.注意: 将 security mode 设置为 None 等效于将 MsmqAuthenticationMode、MsmqProtectionLevel 和 Message 安全设置为 None。
3.若要使元数据交换正常工作,应当向 http 绑定注册一个 URL。这要求服务在具有提升权限的命令窗口中运行。否则,您将接收到异常
最后我以管理员权限来打开这个程序才能注册URL,看来Vista的安全性确实比较高,不知道该怎么写这个程序才能在vista下顺利运行
另外,我测试了一下tcp协议和basicHttp协议的性能差异:两者居然差别不是特别大:服务和客户端程序都在一个服务器上(vista)以tcp方式调用500次,大概使用600毫秒以http方式调用500次,大概使用800毫秒
整体来说http比tcp慢30%不到,还是能够接受当然这是在本机,如果是在公网上跑,就没有这么乐观了。居然没笔调用才1毫秒多一点。神速啊!
附我完整测试的服务配置,供大家参考:<system.serviceModel> <services> <service name="ServerPart.Server" behaviorConfiguration="sb"> <host> <baseAddresses> <add baseAddress="net.tcp://127.0.0.1:5353" /> <add baseAddress="http://127.0.0.1:5356/" /> </baseAddresses> </host> <endpoint address="net" binding="netTcpBinding" bindingConfiguration="bd" contract="ServerPart.IServer" /> <endpoint address="httpend" binding="basicHttpBinding" contract="ServerPart.IServer" bindingConfiguration="httpbd" /> <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" /> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> </service> </services> <bindings> <netTcpBinding> <binding name="bd"> </binding> </netTcpBinding> <basicHttpBinding> <binding name="httpbd"> <security mode="None" /> </binding> </basicHttpBinding> </bindings> <behaviors> <serviceBehaviors> <behavior name="sb"> <serviceMetadata /> <!--<serviceMetadata httpGetEnabled="true" />--> <serviceDebug includeExceptionDetailInFaults="true" /> </behavior> </serviceBehaviors> </behaviors></system.serviceModel>