共享主机上的WCF服务响应“HTTP / 1.1 400 Bad Request”<aka blank =“”page,=“”xml =“”parsing =“”error,=“”invalid =“”address,=“”webpage =“ “can not =”“be =”“found =”“> </aka>

时间:2010-08-17 02:05:45

标签: hosting wcf shared-hosting

对于遇到问题的人和问题,这都是信息。

编辑:问题是为什么要删除“www。”如果在没有“www。”的情况下可以引用在同一地址运行的网站,则会从URL导致此错误。

我最近使用一个简单的WCF服务(来自endpoint.tv的服务)重现了这个问题,解决了通常的配置问题,一方面将服务从本地IIS移动到共享主机。

问题是在浏览器中检查网址后的以下响应(来自fiddler)。在网上搜索关于该主题的帖子时,我发现了一些未解决的问题,另外还指出了同样的问题通常的共享主机配置问题修复它们的帖子。

HTTP / 1.1 400错误请求 服务器:Microsoft-IIS / 7.0 X-Powered-By:ASP.NET 日期:2010年8月17日星期二00:27:52 GMT 内容长度:0

在Safari / Chrome中,这显示为空白页。

在IE中,您会收到“无法找到网页”。

在FF中你得到“XML解析错误:找不到元素位置:http:// ................第1行,第1列:”(我在网上有许多未解决的帖子 - 随意反向链接可能的解决方案)

在Opera中,您会收到“无效地址”

我有一段时间对此感到头疼,然后我想尝试放入“www”。我之前从我的网址中省略了,没有特别的原因。

问题解决了。

我现在可以在浏览器中看到正常输出,并通过WCF测试客户端与服务进行交互。

所以问题是:

当我知道这对托管在同一地址的网站没有任何影响时,为什么这会对托管的WCF服务产生影响有无“www。”我可以浏览同一域中的网站,该网站托管在同一帐户中。

到目前为止,我已经在GoDaddy服务上测试了这个repro。我可以稍后再试一下。

此外,如果您碰巧知道 - 我有兴趣知道哪些功能可能会使我的WCF服务需要完全信任而不是中等信任。对于利用这些特征是否是一个好主意(在最少的私有化背景下)你有任何想法。

作为参考,这是web.config,包括Mike建议尝试解决此问题的其他端点。

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

  <system.web>
    <customErrors mode="Off"/>
    <compilation><!--debug="true"-->
        <buildProviders>
          <remove extension=".svc"/>
          <add extension=".svc" type="System.ServiceModel.Activation.ServiceBuildProvider,System.ServiceModel, Version=3.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089"/>
        </buildProviders>
    </compilation>
  </system.web>

  <!-- When deploying the service library project, the content of the config file must be added to the host's 
  app.config file. System.Configuration does not support config files for libraries. -->
  <system.serviceModel>
    <services>
      <service behaviorConfiguration="blah" 
               name="WCFServ.EvalService">
        <endpoint address="http://www.abcdomain.com/WCFServ/WCFServ.EvalService.svc" 
                  binding="basicHttpBinding" 
                  contract="WCFServ.IEvalService" />
        <endpoint address="http://abcdomain.com/WCFServ/WCFServ.EvalService.svc"
                  binding="basicHttpBinding"
                  contract="WCFServ.IEvalService" />
        <!--<endpoint address="" 
                  binding="mexHttpBinding" 
                  contract="IMetadataExchange" />-->
        <!--<host>
          <baseAddresses>
            <add baseAddress="http://abcdomain.com/WCFServ/" />
          </baseAddresses>
        </host>-->
      </service>
    </services>


    <behaviors>
      <serviceBehaviors>
        <behavior name="blah">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

    <serviceHostingEnvironment>
      <baseAddressPrefixFilters>
        <add prefix="http://www.abcdomain.com/WCFServ/"/>
      </baseAddressPrefixFilters>
    </serviceHostingEnvironment>

  </system.serviceModel>




  <!--http://localhost/WCFServ/WCFServ.EvalService.svc-->

<startup><supportedRuntime version="v2.0.50727"/></startup></configuration>

3 个答案:

答案 0 :(得分:1)

由于您使用绝对URL作为端点地址,因此WCF需要在HTTP请求中查看特定主机头以绑定到这些地址。

Web服务器也不例外;如果它们是针对特定主机配置的,则请求标头必须具有主机名,否则它们将不提供内容。但是,可以将多个主机名绑定到网站,因此有时某个站点可能与www.example.com和example.com绑定。此外,某些Web浏览器,如果您访问example.com并获得404或DNS查找失败,将自动在www.example.com重试该请求。

我认为解决问题最简单的方法是修改端点,使其与主机保持中立。例如:

<services>
  <service behaviorConfiguration="blah" name="WCFServ.EvalService">
    <endpoint address="/WCFServ/WCFServ.EvalService.svc" 
              binding="basicHttpBinding" 
              contract="WCFServ.IEvalService"/>
  </service>
</services>

<!-- Just leave this out
<serviceHostingEnvironment>
  <baseAddressPrefixFilters>
    <add prefix="http://www.abcdomain.com/WCFServ/"/>
  </baseAddressPrefixFilters>
</serviceHostingEnvironment>
-->

答案 1 :(得分:0)

确保在网络配置中没有使用www定义端点。

答案 2 :(得分:0)

此页面对WCF寻址有一些很好的解释: WCF Adressing In Depth

通过在服务类上添加以下属性来解决问题吗?

[ServiceBehavior(AddressFilterMode=AddressFilterMode.Any)]