如何解决:“元数据包含无法解析的引用:'http:// <主机>:<端口> <路径>?wsdl'。” vs

时间:2019-05-28 18:00:28

标签: visual-studio wcf iis wsdl

我一直试图使用非标准的HTTPS端口在IIS服务器上发布WCF Web服务。仅在身份验证(通过基本身份验证)之后才可以访问服务器。我为测试目的而创建的Web服务是在Visual Studio中创建WCF Service Application时默认获得的基础项目。我所做的唯一修改是在web.config文件中:

<?xml version="1.0" encoding="utf-8"?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.6.1" />
    <httpRuntime targetFramework="4.6.1"/>
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    <bindings>
      <basicHttpBinding>
        <binding name="secureHttpBinding">
          <security mode="Transport">
            <transport clientCredentialType="Basic"/>
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <services>
      <service name="SoapApi.Service1">
        <endpoint address=""
                  binding="basicHttpBinding"
                  bindingConfiguration="secureHttpBinding"
                  contract="SoapApi.IService1"/>

        <endpoint address="mex"
                  binding="mexHttpsBinding"
                  contract="IMetadataExchange" />
      </service>
    </services>
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <directoryBrowse enabled="true"/>
  </system.webServer>

</configuration>

在本地文件系统上发布服务并配置IIS之后。从本地PC上的浏览器进行身份验证后,我能够访问服务器上的WSDL文件。但是,如果我尝试使用Visual Studio中的Configure WCF Web Service Reference向导将服务添加到简单的客户端应用程序中,则会收到以下错误消息:

Metadata contains a reference that cannot be resolved:'http://<host>:<port><path>?wsdl'.

和完整的错误消息:

An error occurred while attempting to find services at 'http://<host>:<port><path>?wsdl'. The remote server returned an error: (403) Forbidden.

由于此错误表示我没有访问权限,因此我想为什么不关闭身份验证并尝试是否可以使用。我在IIS中激活了对网站的匿名访问,并取消了基本身份验证。 此外,我在web.config文件中更改了以下段落:

<basicHttpBinding>
    <binding name="secureHttpBinding">
      <security mode="Transport">
        <transport clientCredentialType="None"/>
      </security>
    </binding>
 </basicHttpBinding>

我仍然可以从浏览器访问WSDL文件,但是在将服务引用添加到客户端时仍然出现相同的错误。如果我通过dotnet-svcutil http://<host>:<port><path>?wsdl

进行测试,也会发生同样的情况

如果我尝试在本地添加服务引用,则一切正常,没有任何问题。

其他信息:

  • 我已经安装了.NET Framework 4.6,它是WCF HTTP Activation处理程序。
  • 我将权限IIS_IUSRS添加到了包含服务的文件夹中。

关于为什么会发生这种情况以及如何解决此问题的任何想法?

1 个答案:

答案 0 :(得分:1)

如果使用传输安全模式,为什么不使用https地址? https / http基地址应在IIS网站绑定模块中配置。 enter image description here
另外,由于您使用的是基本身份验证,请在IIS身份验证模块中打开匿名身份验证和基本身份验证。
就我而言,我可以使用基于Core的控制台应用程序正确添加服务引用。
此外,请为WCF启用以下Windows功能。 enter image description here
随时让我知道是否有什么可以帮助您的。