hosting - 共享主机上的 WCF 服务响应 "HTTP/1.1 400 Bad Request"<又名空白页,XML 解析错误,无效地址,找不到网页>

标签 hosting wcf shared-hosting

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

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

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

问题是在浏览器中检查 url 时的以下响应(来自 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 Parsing Error: no element found Location: http://................ Line Number 1, Column 1:”(我在许多 Unresolved 帖子中看到在网络上 - 随时反向链接可能的解决方案)

在 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>

最佳答案

因为您使用绝对 URL 作为端点地址,所以 WCF 需要查看 HTTP 请求中的特定主机 header 才能绑定(bind)到这些地址。

Web 服务器也不异常(exception)。如果它们是为特定主机配置的,则请求 header 必须具有主机名,否则它们将不会提供内容。但是,多个主机名可以绑定(bind)到网站,因此有时一个站点可能会同时绑定(bind)到 www.example.com 和 example.com。此外,如果您访问 example.com 并获得 404 或 DNS 查找失败,某些 Web 浏览器将自动重试 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>
-->

关于hosting - 共享主机上的 WCF 服务响应 "HTTP/1.1 400 Bad Request"<又名空白页,XML 解析错误,无效地址,找不到网页>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3498824/

相关文章:

c# - 从共享主机上的 asp.net 页面启动控制台应用程序

azure - 由于 azure 网站无法将 IP 地址解析为网站,因此无法进行 A 记录重定向

azure - 公共(public)域下的数百个 Azure Functions

php - SQL注入(inject)我应该知道的符号

c# - Web 服务与 Java 的集成,它们的类型有问题吗?

c# - 字符串长度评估不正确

git - 我不应该在 "htdocs"中放置一个 git 存储库吗?

linux - Laravel:将网络上传到我的主机时无法显示图像

node.js - 如何托管 HTML Node.js 应用程序

c# - WCF - 传递参数