我正在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>
答案 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配置不允许用户进程绑定到外部地址。要解决这个问题,您需要做三件事:
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" />
完全披露:如果您愿意以管理员用户身份运行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仅绑定到每个项目的一个站点。对于真正的IIS,这很好,因为这可能是您想要的*:80绑定。对于IIS Express,您需要为每个IP地址单独绑定,因此您需要告诉WCF全部使用它们。这很简单,只需将其添加到您的WCF配置中:
<configuration>
<system.serviceModel>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
</configuration>
完成所有操作后,关闭IIS Express并让VS重新启动它,你应该全部设置好。