今天,我们的项目几乎搞完了。由于进行视频拍摄的需要,我们打算将Silverlight项目部署到IIS来演示和测试。但是部署的道路确实非常曲折的,并且问题很多很多,我足足花了一个晚上才配置完成。为了以后大家少走弯路,我特写这篇文章。如果不足之处,请大家指正!
首先,配置的时候,我将我的项目复制到桌面,然后利用IIS7添加网站,并且把虚拟路径设置到项目的绝对路径。但是,运行时却提出一大堆错误。“HTTP 错误 500.19 - Internal Server Error无法访问请求的页面,因为该页的相关配置数据无效。”经过网上搜索资料,这个问题是由于Windows 7下的IISUSER用户没有权限访问这个文件夹。因此要打开这个文件夹的属性,在安全的选项卡添加IISUSER这个用户,并且赋予它读的权限。其实有个最简单的办法,直接将项目复制到/inetpub/wwwroot问题就解决了,因为/inetpub/wwwroot的文件夹是共享的,任何用户都可以访问。
第二个问题HTTP Error 500.19 - Internal Server Error配置错误: 不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定是默认设置的(overrideModeDefault="Deny"),或者是通过包含 overrideMode="Deny" 或旧有的allowOverride="false" 的位置标记明确设置的。出现这个错误是因为 IIS 7 采用了更安全的 web.config 管理机制,默认情况下会锁住配置项不允许更改。要取消锁定可以运行命令行 %windir%/system32/inetsrv/appcmd unlock config -section:system.webServer/handlers 。其中的 handlers 是错误信息中红字显示的节点名称。如果modules也被锁定,可以运行%windir%/system32/inetsrv/appcmd unlock config -section:system.webServer/modules另外,如果使用Asp.net的朋友,在安装IIS7的时候一定记得勾选Asp.net,默认不选,也会出现类似的错误信息
问题解决两个个,接着又出现了两个问题,提示是识别不了.aspx和.svc这两个后缀的文件,于是再次上网查找资料,最后发现是由于ASP.net还没注册到IIS的原因和没有安装WCF成功的原因,于是运行aspnet_iis -i重新注册IIS,然后打开“开始|所有程序|附件|命令提示符”,输入“cd C:/Windows/Microsoft.NET/Framework/v3.0/Windows Communication Foundation”,回车。
再输入“ServiceModelReg.exe -i”,回车。搞定。自己开始有点高兴了,网站可以正常运行了。
但是,当点击响应按钮时,却一点反应都没有。这个按钮的响应事件里面是用到WCF服务器,我第一时间就确定问题就出现在这里。但是没法找出原因,于是上网找关于WCF在IIS部署资料,但是没有找到合适的解决方案。于是也没心情弄了,去冲凉回来再弄。回来时,自己有点怀疑是绑定的地址问题。因为我用的默认的WCF service enabled Silverlight的绑定方式mexHttpBinding,而网上有很多资料都是Silverlight2.0只支持basicHttpBinding,但是由于自己是刚刚接触Silverlight,因此有很多东西都不是很明白,并且网上关于Silverlight3的书籍还是比较少的。。。在无奈之下,我突然发现有个客户端配置文件,里面有个如下的配置代码
<configuration>
<system.serviceModel>
<bindings>
<customBinding>
<binding name="CustomBinding_UserService">
<binaryMessageEncoding />
<httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
</binding>
<binding name="CustomBinding_DistrictService">
<binaryMessageEncoding />
<httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
</binding>
</customBinding>
</bindings>
<client>
<endpoint address="http://localhost:3219/UserService.svc"
binding="customBinding" bindingConfiguration="CustomBinding_UserService"
contract="UserServiceReference.UserService" name="CustomBinding_UserService" />
<endpoint address="http://localhost:3219/DistrictService.svc"
binding="customBinding" bindingConfiguration="CustomBinding_DistrictService"
contract="DistrictServiceReference.DistrictService" name="CustomBinding_DistrictService" />
</client>
</system.serviceModel>
</configuration>
于是我改下虚拟路径的端口,再次运行,竟然成功了,突然自己也放松了很多。。。。
其实,这个地址只适合在本机运行,当你以IP形式访问是,客户端那个地址必须相应改为IP才行,例如http://192.168.1.1:3219/DistrictService.svc,然后再次编译部署才能使用,但这是你如果使用localhost,它却使用不了了。(微软这个能不能动态更新地址的呢??)
希望对大家有用,免得走弯路去查找资料。