代码之家  ›  专栏  ›  技术社区  ›  Mick N

共享主机上的WCF服务响应“HTTP/1.1 400错误请求”<aka空白页,XML解析错误,无效地址,找不到网页>

  •  5
  • Mick N  · 技术社区  · 14 年前

    这既是对遇到问题的人的信息,也是一个问题。

    在解决了将服务从本地IIS移动到共享主机所面临的常见配置问题后,我最近使用了一个微不足道的WCF服务(来自endpoint.tv的服务)重现了这个问题。

    在网上搜索关于这个主题的帖子时,我发现了一些未解决的问题,这些问题都指向同一个问题,除了常见的共享主机配置问题解决的帖子之外。

    服务器:Microsoft IIS/7.0 X-Powered-By:ASP。网 日期:2010年8月17日星期二00:27:52 GMT

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

    在IE中,你会得到“找不到网页”。

    在FF中,您会看到“XML解析错误:未找到元素位置:http://................ 第1行第1栏:“(我在网上的许多未解决的帖子中看到了这一点——请随意反向链接一个可能的解决方案)

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

    我对此挠头了一会儿,然后我想试试 把我之前忽略的“www”放进去

    问题解决了。

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

    为什么这会对托管的WCF服务产生影响 当我知道浏览同一地址的网站没有什么区别时? 无论有没有“www”,我都可以浏览到同一个域名的网站,托管在同一个帐户上。

    到目前为止,我已经在GoDaddy服务上测试了这个程序。我可能稍后再试试其他的。

    另外,如果您碰巧知道-我想知道哪些功能可能使我的WCF服务需要完全信任,而不是中等信任。以及您对利用这些功能是否是一个好主意的任何想法(在隐私意识最少的情况下)。

    这是网上的参考资料。配置,包括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 回复  |  直到 14 年前
        1
  •  1
  •   Jacob    14 年前

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

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

    <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>
    -->
    
        2
  •  0
  •   Mike    14 年前

    确保在web配置中定义了没有www的端点。

        3
  •  0
  •   Kris van der Mast    14 年前

    WCF Adressing In Depth .

    通过在serviceclass上添加以下属性是否解决了问题?

    [ServiceBehavior(AddressFilterMode=AddressFilterMode.Any)]