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>