Web services WCF在查看MyService.svc?wsdl时未使用计算机名而不是域名

Web services WCF在查看MyService.svc?wsdl时未使用计算机名而不是域名,web-services,wcf,iis,ssl,configuration,Web Services,Wcf,Iis,Ssl,Configuration,我的WCF服务似乎使用计算机名而不是域名。当我查看MyService.svc?wsdl链接时,它会显示我的计算机名 我应该在web.config中的何处添加我的域名?端点地址、基地址或标识 注意:我正在使用SSL,因此它必须是https://www.example.com/myservice.svc我们正在使用更改主机名 WCFExtras是一个小型开源库,允许您编写以下内容来更改主机名: <behaviors> <endpointBehaviors> <

我的WCF服务似乎使用计算机名而不是域名。当我查看
MyService.svc?wsdl
链接时,它会显示我的计算机名

我应该在web.config中的何处添加我的域名?端点地址、基地址或标识

注意:我正在使用SSL,因此它必须是
https://www.example.com/myservice.svc

我们正在使用更改主机名

WCFExtras是一个小型开源库,允许您编写以下内容来更改主机名:

<behaviors>
  <endpointBehaviors>
    <behavior name="xxx">
      <wsdlExtensions location="http://some-hostname-visible-from-outside/path-to-a-service/service.svc" singleFile="True" />
    </behavior>
  ...

...

对于IIS7,您不会将其添加到web.config,而是添加到IIS配置文件中

首先,编辑网站的绑定,以便HTTP协议指定主机名(如果尚未指定),这将确保它在HTTP下获得正确的名称

导航到C:\Windows\System32\inetsrv\config并打开applicationHost.config

查找站点部分。您将看到如下内容

<sites>
  <site name="Default Web Site" id="1">
    <application path="/">
        <virtualDirectory path="/" physicalPath="%SystemDrive%\inetpub\wwwroot" />
    </application>
    <bindings>
      <binding protocol="http" bindingInformation="*:80:puck" />
      <binding protocol="net.tcp" bindingInformation="808:*" />
      <binding protocol="net.pipe" bindingInformation="*" />
      <binding protocol="net.msmq" bindingInformation="localhost" />
      <binding protocol="msmq.formatname" bindingInformation="localhost" />
      <binding protocol="http" bindingInformation="*:80:puck.idunno.org" />
      <binding protocol="http" bindingInformation="*:80:localhost" />
      <binding protocol="https" bindingInformation="*:443:" />
    </bindings>
  </site>
  ....
</sites>

....
您可以看到http协议的绑定指定了主机头,但https没有。当您进行web浏览时,您不能通过HTTPS使用主机头,但WCF在生成WSDL时仍然使用它-如果找不到主机头,它将返回到机器名

因此,您需要做的就是像这样编辑HTTPS绑定

      <binding protocol="https" bindingInformation="*:443:puck" />

将正确的FQDN追加到绑定信息的末尾。重置IIS和WCF应立即获得它


darin已经发布了IIS6解决方案,这篇文章为我解决了这个问题。我需要将我的域名与我的IP地址和IIS中的网站相关联


我在这里添加了解决方案。它应该适合你们所有人,因为它可以在本地、登台和生产上与我一起工作,而无需在iis上进行绑定

这些解决方案对我都没有帮助。我可以通过一个非常简单的定制服务工厂来解决这个问题


您尝试过吗?

WCF 4.0通过使用请求头的新配置选项在某些情况下解决了此问题:

    <behaviors>
        <serviceBehaviors>
            <behavior name="AutoVaultUploadBehavior">
                <useRequestHeadersForMetadataAddress>
                    <defaultPorts>
                        <add scheme="https" port="443" />
                    </defaultPorts>
                </useRequestHeadersForMetadataAddress>

虽然这是一篇老文章,但这里有一个答案。 在“服务行为-->服务元数据”下添加服务url


请注意,如果您不添加myService,它将抛出另一个错误。

我的生产服务器出现了这个问题。我找到了关于IIS和WCF问题的多主机头的各种文章,但如果您使用SSL,则无法将主机头添加到IIS UI中的网站标识中,只能将其添加到普通HTTP标识中:

但是,您可以通过命令提示符脚本添加SSL主机头,这为我解决了问题:

cscript.exe adsutil.vbs set /w3svc/<site identifier>/SecureBindings ":443:<host header>"
cscript.exe adsutil.vbs集/w3svc//SecureBindings:443:

有关此问题的详细信息,请参阅此链接:

要解决此问题,请在web.config文件中配置httpGetEnabled属性和httpsGetEnabled属性

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

如本链接所述

它解决了我的问题,可能是因为我在同一台主机上有多个网站,而且非常简单

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

只需添加
以解决我的问题。 似乎WCF 4.0通过添加以下内容来处理标题 我使用SSL访问WCF服务

感谢卡纳斯·罗伯特。 解决我问题的步骤- 1.在浏览器中生成wsdl并保存到文件(通过在浏览器中点击.svc?wsdl)另存为.wsdl

  • 通过点击wsdl中的url(xsd=xsd0等)生成xsd文件,并从浏览器保存到文件,另存为.wsdl

  • 将wsdl中的所有机器名引用替换为域名(或ip地址),并更改xsd引用,将xsd文件中的所有机器名引用保存并替换为域名(或ip地址) 确保使用.xsd扩展名命名xsd文件(即name0.xsd、name1.xsd、name2.xsd)

  • 将wsdl和xsd文件复制到虚拟目录 将以下行添加到web.config:

  • 
    
    这是可行的,但我遇到了一个问题,只有我指定的确切域名才能起作用。例如,如果我这样做:**:443:domain.com,则只有domain.com/Service.svc可以工作;如果我这样做:**:443:www.domain.com,则只有www.domain.com/Service.svc可以工作,但不能同时工作。我怎样才能两者兼得?(带有https前缀)看看这是否有帮助。真是个黑客。这是一个已知的错误,因为我看不出共享主机是如何处理的!同样的问题和这个解决方案对我来说非常有效。谢谢http呢?怎么做?简单,容易,正是需要的。我不知道为什么其他人都在建议这些复杂的解决方案。这正是OP想要的。这对我来说很容易!谢谢@Haridharan