WCF只接受localhost

时间:2015-01-17 12:46:52

标签: wcf iis-express

我正在Visual Studio Express中编写第一个WCF,并将其配置为在IIS Express下运行。我的Web.config如下所示。在我的浏览器中,如果我在http://localhost:50000/Service1.svc上执行获取请求,则可以访问该服务,但不能访问http://10.0.0.26:50000/Service1.svc,其中10.0.0.26是我的IP。如何配置IIS Express的WCF以接受IP地址。最后,我可以通过网络联系我的服务。

<?xml version="1.0"?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <system.serviceModel>
    <services>
    <service name="medSaveWCF.Service1">
      <endpoint address="../Service1.svc"
        binding="webHttpBinding"
        contract="medSaveWCF.IService1"
        behaviorConfiguration="webBehaviour" />
    </service>
  </services>

    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="webBehaviour">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <protocolMapping>
        <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Content-Type, Accept" />
      </customHeaders>
    </httpProtocol> 
    <modules runAllManagedModulesForAllRequests="true"/>
    <!--
        To browse web app root directory during debugging, set the value below to true.
        Set to false before deployment to avoid disclosing web app folder information.
      -->
    <directoryBrowse enabled="true"/>
  </system.webServer>

</configuration>

1 个答案:

答案 0 :(得分:1)

(附注:我在博客上写过这个,包括使用SSL所需的其他设置步骤:http://blog.kutulu.org/2015/01/using-iis-express-with-remote-systems.html

问题是IIS Express默认只侦听localhost地址。原因是,IIS作为用户进程运行,但使用与完整IIS相同的HTTPD.SYS系统库。默认情况下,HTTPD.SYS配置不允许用户进程绑定到外部地址。要解决这个问题,您需要做三件事:

  1. 编辑IIS配置以绑定到新端口
  2. 更新HTTPD.SYS以允许您的用户使用该新绑定。
  3. 告诉WCF你有多个绑定。
  4. 第一步:IIS Express设置

    IIS Express配置直接通过XML配置文件完成,该文件位于:

    C:\Users\[username]\Documents\IISExpress\config\applicationhost.config
    

    如果您的项目已经设置为与IIS Express一起使用,那么您将在文件中找到一个大约150行的配置块 - 查找XML <sites>标记,然后您就可以找到它。找到<site>元素:

    <site name="MySolution.MyProject" id="2">
        <application path="/" applicationPool="Clr4IntegratedAppPool">
            <virtualDirectory path="/"          
                              physicalPath="C:\Projects\MySolution\MyProject" />
        </application>
        <bindings>
            <binding protocol="http" bindingInformation="*:50000:localhost" />
        </bindings>
    </site>
    

    <bindings>元素内部是IIS Express在运行该特定站点时绑定的端口和主机名列表,您只需添加一个新的绑定元素:

            <binding protocol="http" bindingInformation="*:50000:10.0.0.26" />
    

    第二步:HTTPD.SYS权限

    完全披露:如果您愿意以管理员用户身份运行Visual Studio和IIS Express,则此步骤是可选的。但这违背了IIS Express的全部目的,这是一个用户模式 Web服务器,所以不要这样做。

    相反,您只需要使用netsh命令重新配置HTTPD.SYS,以允许绑定到所需的端口。具体来说,您需要使用http add urlacl命令。

    启动管理命令提示符和/或PowerShell提示符并执行以下操作:

    netsh http add urlacl url=http://10.0.0.26:5000 user=Everyone
    

    两者完成后,关闭IIS Express,以便VS重新启动它,你应该全部设置。

    我给自己写了一个小的Powershell脚本来完成并为各种端口执行此操作:

    $LowPort = 50000
    $RangeSize = 99
    
    for ( $i = 0; $i -le $RangeSize; $i++ ) 
    {
      netsh http delete urlacl url="http://${IISHost}:$($LowPort + $i)/"
      netsh http add urlacl url="http://${IISHost}:$($LowPort + $i)/" user=Everyone
    }
    

    这样我每次都不记得这样做,我只需要使用50000 - 50100范围内的端口。

    第三步:通知WCF

    默认情况下,WCF仅绑定到每个项目的一个站点。对于真正的IIS,这很好,因为这可能是您想要的*:80绑定。对于IIS Express,您需要为每个IP地址单独绑定,因此您需要告诉WCF全部使用它们。这很简单,只需将其添加到您的WCF配置中:

    <configuration>
      <system.serviceModel>
        <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
      </system.serviceModel>
    </configuration>
    

    完成所有操作后,关闭IIS Express并让VS重新启动它,你应该全部设置好。