对于遇到问题的人和问题,这都是信息。
编辑:问题是为什么要删除“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>
答案 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)]