WCF服务在内部工作,但不在外部工作

时间:2015-10-05 17:34:05

标签: c# wcf iis-7 reverse-proxy svc

我在框架4上有一个WCF服务在内部网络中运行良好。在外部,我可以看到目录浏览,因为在web.config中启用了,但是一旦我点击svc文件就会抛出404"服务器错误在' /'应用&#34 ;.还有一个DMZ反向代理,我相信这是我的问题。我检查了IIS-7日志,并且没有记录404错误,只记录内部访问200 OK。 IIS有很多服务和站点在运行,但这是我公司第一次使用REST服务尝试WCF。几天来,我一直在寻找答案,只找到不适用于我的项目的解决方案。下面是我的配置文件。提前感谢您的帮助。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.net>
<defaultProxy useDefaultCredentials="true"></defaultProxy>
</system.net>

<system.diagnostics>
<sources>
<source propagateActivity="true" name="System.ServiceModel"  switchValue="Warning,ActivityTracing">
 <listeners>
   <add type="System.Diagnostics.DefaultTraceListener" name="Default">
     <filter type="" />
      </add>
      <add name="ServiceModelTraceListener">
        <filter type="" />
      </add>
    </listeners>
  </source>
</sources>
<sharedListeners>
  <add initializeData="X:\RestService\DrillSvc\web_tracelog.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="ServiceModelTraceListener" traceOutputOptions="Timestamp">
    <filter type="" />
  </add>
</sharedListeners>
</system.diagnostics>
<appSettings />
<connectionStrings>
<add name="cn" connectionString="Data Source =test ;  initial catalog=Drillers; User Id=userid; Password=password" providerName="System.Data.SqlClient" />
</connectionStrings>
<system.web>

<compilation debug="true" targetFramework="4.0">
  <assemblies>
    <add assembly="System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364123" />
  </assemblies>
</compilation>
<authentication mode="Windows" />
<pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID" />
    <identity impersonate="false" />
</system.web>

<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
  <!--<remove name="webDAVModule"/>-->
</modules>

<directoryBrowse enabled="true" />
</system.webServer>
<system.serviceModel>
<bindings>
  <webHttpBinding>
    <binding name="WCFwebBinding">
      <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="Windows"/>
      </security>
    </binding>  

  </webHttpBinding>
</bindings>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true">    </serviceHostingEnvironment>
<services>
  <service behaviorConfiguration="DrillServiceBehavior" name="DrillService">
    <endpoint address="" behaviorConfiguration="WCFDrillWebBehavior" binding="webHttpBinding" contract="IDrillService">
      <identity>
        <dns value="mycompany.com" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>
</services>
<behaviors>
  <endpointBehaviors>
    <behavior name="WCFDrillWebBehavior">
      <webHttp />
    </behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior name="ServiceBehavior">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
    <behavior name="DrillServiceBehavior">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>`

更新:我添加了一个简单的HTML页面,它可以从外部公共工作,但svc文件仍然没有找到404错误。

2 个答案:

答案 0 :(得分:1)

最后,在做了各种改变后,我发现了问题。在inetpub / wwwroot下的wcf服务的托管内部服务器中,有一个专门用于IIS站点而不是服务web.config的配置文件。添加此代码后,第一次尝试。 DMZ不需要改变。希望这会对其他人有所帮助。

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

答案 1 :(得分:0)

如果不了解环境,代理或者您正在测试服务的方式,很难肯定地说,但这里有几件事需要检查:

  • 验证代理配置是否正确。
  • 验证是否可以从代理服务器访问该服务。

最后,如果您尝试通过HTTPS从外部浏览服务,则需要确保在配置中通过HTTPS公开服务元数据:

<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />

希望这有助于指明你正确的方向。