zoukankan      html  css  js  c++  java
  • 【WCF】如何将WCF部署到远程服务器

    一、前言

          最近需要将自己写的WCF服务部署到远程服务器上,也就是公网上。宿主是IIS,在配置成功之前遇到了很多问题,问题如下:

          1. WCF该怎么宿主在IIS上,为何会出现 400 Bad Request

          2. 防火墙如何开放

          3. 为何我能在客户端引用服务,但是运行时依然提示Soap操作错误,404 Not Found

         

          那么接下来,我就告诉大家我走过的坑,也避免了百度上各种司机瞎带路。(网上好多其实是本地部署,Localhost谁都会,VS直接Debug都行)

    二、准备阶段

         首先你要配置好的你的web.config,web.config的配置正确与否直接影响你WCF部署的成功与否。这里我可以提供一个我的例子,供大家参考:

     1 <?xml version="1.0"?>
     2 <configuration>
     3   <appSettings/>
     4   <connectionStrings/>
     5   <system.web>
     6     <compilation debug="true" targetFramework="4.0"/>
     7     <!--
     8         通过 <authentication> 节,可以配置
     9         ASP.NET 用于识别来访用户身份的
    10         安全验证模式。 
    11     -->
    12     <authentication mode="Windows"/>
    13     <!--
    14         如果在执行请求的过程中出现未处理的错误,
    15         则可以通过 <customErrors>16         配置相应的处理步骤。具体来说,
    17         开发人员可以通过该节配置
    18         将取代错误堆栈跟踪显示的 HTML 错误页。
    19 
    20         <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
    21          <error statusCode="403" redirect="NoAccess.htm" />
    22          <error statusCode="404" redirect="FileNotFound.htm" />
    23         </customErrors>
    24     -->
    25     <pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/>
    26   </system.web>
    27   <!-- 
    28       在 Internet 信息服务 7.0 下运行 ASP.NET AJAX 时 system.webServer 节
    29       是必需的。而对于早期版本的 IIS,此节并不是必需的。
    30   -->
    31   <system.webServer>
    32     <!--
    33         若要在调试过程中浏览 Web 应用程序根目录,请将下面的值设置为 True。
    34         在部署之前将该值设置为 False 可避免泄露 Web 应用程序文件夹信息。
    35       -->
    36     <directoryBrowse enabled="true"/>
    37   </system.webServer>
    38   <system.serviceModel>
    39 
    40     <bindings>
    41       <basicHttpBinding>
    42         <binding name="bindingConfig" closeTimeout="00:30:00" openTimeout="00:30:00"
    43           receiveTimeout="00:30:00" sendTimeout="00:30:00" hostNameComparisonMode="StrongWildcard"
    44           maxBufferPoolSize="2147483647"
    45           maxReceivedMessageSize="2147483647"
    46           maxBufferSize="2147483647"
    47           messageEncoding="Text">
    48           <security mode="None"/>
    49         </binding>
    50       </basicHttpBinding>
    51     </bindings>
    52     
    53            
    54     <services>
    55       <service behaviorConfiguration="BiChengUpdateService.Service1Behavior"
    56         name="BiChengUpdateService.UpdateService">
    57         <endpoint address="" binding="basicHttpBinding"
    58           bindingConfiguration="bindingConfig" name="Endpoint1" contract="BiChengUpdateService.IUpdateService" />
    59         <endpoint address="mex" binding="mexHttpBinding" name="Endpoint2"
    60           contract="IMetadataExchange" />
    61       </service>
    62     </services>
    63     <behaviors>
    64       <serviceBehaviors>
    65         <behavior name="BiChengUpdateService.Service1Behavior">
    66           <!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false -->
    67           <serviceMetadata httpGetEnabled="true"/>
    68           <!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 -->
    69           <serviceDebug includeExceptionDetailInFaults="false"/>
    70           <serviceThrottling maxConcurrentCalls="1000" maxConcurrentSessions="1000" maxConcurrentInstances="1000" />
    71         </behavior>
    72       </serviceBehaviors>
    73     </behaviors>
    74   <serviceHostingEnvironment  multipleSiteBindingsEnabled="true" /> 
    75   </system.serviceModel>
    76 </configuration>

    这里,一定要注意的是两个地方:

    1. Endpoint address

    2. MultipleSiteBindingEnabled

    问:web.config里有两个Endpoint address, 一个是mex(这个我们不管),另一个是”空”(这个特别重要),为什么要设成空值呢?

         难道部署在远程服务器上不应该写的是服务器的IP地址吗?

    答:错!这个WCF所部署的IP地址和其相应的端口我们交给IIS即可。

    问:如果我在Endpoint address写了服务器的IP地址及端口,例如:114.112.133.23:2037/UpdateserIve.svc会如何?

    答:那你就掉坑里了,如果这样写,客户端确实可以引用你的服务,但是在114.112.133.23:2037/UpdateserIve.svc?wsdl(用浏览器打开),

          看最后一行,你会发现你的Soap Address会是这个尿性:114.112.133.23:2037/UpdateserIve.svc/114.112.133.23:2037/UpdateserIve.svc

          这明显地址有复制了一遍嘛!!!然后客户端的会出现Soap 操作错误,具体的错误Message为404 Not Found。

          配置好上述config后,我们在远程服务器硬盘上新建一个文件夹,放置发布服务时需要的文件,一共三个:bin, .svc 以及web.config

          bin文件主要放置你在WCF服务中生成的dll,其实你编译完WCF服务项目后,直接把bin文件拷贝了就行。

    三、IIS配置

          1. 打开远程服务器的IIS,找到“处理程序映射”,看看有没有这个:

          

              没的话,这个可以百度一下,我就不赘述了,这步没司机会坑你。     

             2. 添加一个应用程序池,专门给你部署的WCF服务使用:

     

              

               托管管道模式为集成!请注意,你的WCF项目编译时也要一致!       

              3. 新建网站,配置网站的物理地址:

              物理地址就是之前新建的文件夹,应用程序池就是我们之前刚建的应用程序池。这里没显示出.svc及web.config,网站右键切换到内容视图即可

             4. IIS的配置端口:

            

             IP地址不要写你的服务器公网地址,会出现400 Bad Request,直接选择全部未分配

    四、防火墙设置

          有百度大神说把防火墙关了,关你大爷,服务器这么重要关什么防火墙。假设你要用7293端口,你只要在防火墙开放这个端口即可。

           首先,你的防火墙一定要能允许WCF运行:

           其次,新建入站规则,点击端口,开放出你所需要的WCF端口即可!

    五、总结

          WCF既要求你会写代码,又要你会配置,最后还得要求你会部署。总结下这几个步骤:

    1. 写好代码,IServiceT以及ServiceT.svc

    2. 配置好你的web.config,这个是核心,建议多看看博园里大神的分析与指导。

    3. IIS的配置,应用程序池->处理程序映射->新建网站->物理路径->IP及端口

    4. 防火墙配置,是否允许WCF->新建入站规则,开放指定的WCF端口

    5. 远程服务器WCF配置完后,在你客户端电脑上去访问页面:XXX.XXX.XXX.XX:XX/YYY.svc ,

        如果正常:继续在该Url后添上“?wsdl”,即:

        XXX.XXX.XXX.XX:XX/YYY.svc?wsdl,查看网页最下方的Soap Address是否为XXX.XXX.XXX.XX:XX/YYY.svc

                       如果是机器名:win2008:XX/YYY.svc,那你肯定第二步没做好!

        如果不正常第三步就有问题了

  • 相关阅读:
    如何查看python的当前版本号
    Android数据库程序开发必备工具SqliteDev 狼人:
    Android四种Activity的加载模式 狼人:
    20+ 个很棒的 jQuery 文件上传插件或教程(此文值得“推荐”和“收藏”) 狼人:
    艾伟:10分钟去除天天团购系统版权 狼人:
    WIN7,server2008 IIS 伪静态 不能显示特殊图片 加号 减号 “+”,""号的图片需要转义才可以显示 狼人:
    近百余款最新HTML5应用案例给大伙儿共享了 狼人:
    shopex李钟伟:独立电子商务发展与网络购物 狼人:
    《天将客户关系管理系统》 狼人:
    Shopex V4.8.4 V4.8.5 后台拿Shell 0Days 狼人:
  • 原文地址:https://www.cnblogs.com/lovecsharp094/p/5843632.html
Copyright © 2011-2022 走看看