将基于WCF实现与客户端通信的Silverlight项目部署到IIS7.0

来源:互联网 发布:现货原油行情分析软件 编辑:程序博客网 时间:2024/05/01 17:34

       今天,我们的项目几乎搞完了。由于进行视频拍摄的需要,我们打算将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,它却使用不了了。(微软这个能不能动态更新地址的呢??)

    希望对大家有用,免得走弯路去查找资料。