19

我知道有很多关于此的帖子,并且我已经浏览了所有在我的搜索中出现的帖子并实施了提到的所有内容。我有一个 WCF Web 服务,可以在我的本地系统上运行 HTTP,它在服务器上运行 HTTP。但是客户端要求它通过 HTTPS 工作。这个网站和其他网站上的大量帖子告诉我,这并不像应有的那么简单,因为在此之前,ASMX Web 服务“正常工作”并且不需要复杂的配置。

我的当前配置出现以下错误:

找不到与具有绑定 WSHttpBinding 的端点的方案 https 匹配的基地址。注册的基地址方案是 [http]。

这是我目前的代码,经过几天的尝试配置它无济于事:

<system.serviceModel>

    <!--     -->
    <serviceHostingEnvironment  aspNetCompatibilityEnabled="true" >
        <baseAddressPrefixFilters>
            <add prefix="https://mysite.com"/>
            <add prefix="http://mysite.com"/>
        </baseAddressPrefixFilters>
    </serviceHostingEnvironment>

    <!-- Set up Custom Behaviors -->    
    <behaviors>

        <endpointBehaviors>
        </endpointBehaviors>

        <serviceBehaviors>
            <behavior name="WebPostService.WebPostServiceBehavior">
                <serviceMetadata httpsGetEnabled="true" httpsGetUrl="WebPostServices.svc/mex"  /> 
                <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
        </serviceBehaviors>

    </behaviors>

    <!-- Set up the binding configuration  -->
    <bindings>

        <wsHttpBinding>
            <binding    name="SOAPBinding" 
            >

                <security mode="Transport">
                </security>
            </binding>
        </wsHttpBinding>

    </bindings>

    <services>

        <service    
                    behaviorConfiguration="WebPostService.WebPostServiceBehavior"
                    name="WebPostService.WebPostService"
        >

    <host>
      <baseAddresses>
        <add baseAddress="https://mysite.com/Services/WebPostService.svc"/>
      </baseAddresses>
    </host>
            <endpoint   address="" 
                        binding="wsHttpBinding" 
                        bindingConfiguration="SOAPBinding"
                        contract="WebPostService.IWebPostService"
            >
                <identity>
                    <dns value="mysite.com" />
                </identity>
            </endpoint>

            <endpoint   
                        address="mex" 
                        binding="mexHttpsBinding" 
                        contract="IMetadataExchange" 
            >
            </endpoint>

        </service>

    </services>

</system.serviceModel>

我做错了什么,我怎样才能让它通过 HTTPS 工作?我很沮丧,这并不像它应该的那么简单。在这个项目上工作的几个月里,我一直沉浸在 MSDN 的 WCF 文档中,并且对服务、端点和绑定有很好的了解——这比我完全不了解更让我感到沮丧。

更新:仍在努力解决这个问题,当我尝试为 mex 地址输入完整 URL 时遇到了一个奇怪的错误。我改成这样:

address="https://prcwebs.com/Services/WebPostService.svc/mex" 

并得到错误:

此服务的安全设置需要 Windows 身份验证,但托管此服务的 IIS 应用程序未启用它。

我没有尝试使用 Windows 身份验证,安全设置未更改,仍设置为

<安全模式="传输" />

找不到与具有绑定 WebHttpBinding 的端点的方案 https 匹配的基地址。注册的基地址方案是 [http] -没有帮助, 没有 提到任何有帮助 的内容 尝试更改为不同的安全模式,仍然无法使网站正常工作。

4

4 回答 4

4

添加multipleSiteBindingsEnabled="true"serviceHostingEnvironment更新安全性以禁用客户端凭据:

<security mode="Transport">
    <transport clientCredentialType="None"></transport>
</security>

编辑 我在 Windows 2003 下的最终工作版本具有以下配置。

<system.serviceModel>
    <serviceHostingEnvironment  aspNetCompatibilityEnabled="false" />

    <!-- Set up Custom Behaviors -->    
    <behaviors>
        <endpointBehaviors>
        </endpointBehaviors>
        <serviceBehaviors>
            <behavior name="WebPostService.WebPostServiceBehavior">
                <serviceMetadata httpsGetEnabled="true" httpsGetUrl="WebPostServices.svc/mex"  /> 
                <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
        </serviceBehaviors>
    </behaviors>

    <!-- Set up the binding configuration  -->
    <bindings>
        <wsHttpBinding>
            <binding name="SOAPBinding">
                <security mode="Transport">
                  <transport clientCredentialType="None"/>
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>

    <services>
        <service behaviorConfiguration="WebPostService.WebPostServiceBehavior"
                 name="WcfService2.Service1">

            <host>
                <baseAddresses>
                    <add baseAddress="https://localhost/Service/Service1.svc"/>
                </baseAddresses>
            </host>
            <endpoint address="" 
                      binding="wsHttpBinding" 
                      bindingConfiguration="SOAPBinding"
                      contract="WcfService2.IService1">
                <identity>
                    <dns value="localhost" />
                </identity>
            </endpoint>

            <endpoint address="mex" 
                      binding="mexHttpsBinding" 
                      contract="IMetadataExchange">
            </endpoint>
        </service>
    </services>
</system.serviceModel>

您可以使用 https 访问该网站,所以我猜安装的证书部分是正确的。如果您有任何想与我的设置进行比较的内容,请告诉我。

于 2013-01-30T20:32:06.380 回答
3

您为 HTTPS 使用了错误的绑定。

有两个单独的绑定类。wsHttpBinding 和 wsHttpsBinding 通知 s。您需要在绑定下为 HTTPS 添加一个 wsHttpsBinding,并且您需要为该绑定创建一个新端点。

此外,您通常会看到特定错误,我可以查看是否没有从该位置为 https 设置 IIS。

  • 打开 IIS 管理器
  • 打开网站
  • 右键单击默认网站。
  • 编辑绑定
  • 确保存在 https 和 http 条目。

  • 打开 IIS 管理器
  • 找到您的应用程序(我认为它将成为默认网站)。
  • 右键点击
  • 管理网站/应用程序
  • 高级设置
  • 启用的协议
  • http,https
于 2013-02-01T16:48:02.873 回答
3

我用了这个,它对我有用,也许它可以帮助你

要在 WCF WsHttp 绑定上启用 Https,应该在 web.config 文件中更改一些简单的步骤。

这些步骤是:

在服务的 web.config 文件中启用传输级安全性:

在此步骤中,您需要将安全模式从无更改为传输。下面的代码显示了如何做到这一点:

<bindings>
    <wsHttpBinding>
        <binding name="TransportSecurity">
            <security mode="Transport">
                <transport clientCredentialType="None"/>
            </security>
        </binding>
    </wsHttpBinding>
</bindings>

绑定绑定并指定 HTTPS 配置

您现在需要将绑定、预览步骤与端点相关联。使用 bindingConfiguration 标记来指定绑定名称。您还需要指定托管服务的地址。下面的代码显示了如何做到这一点

<service name="WCFWSHttps.Service1" behaviorConfiguration="WCFWSHttps.Service1Behavior">
<!-- Service Endpoints -->
    <endpoint address=https://localhost/WCFWSHttps/Service1.svc binding="wsHttpBinding"  bindingConfiguration="TransportSecurity" contract="WCFWSHttps.IService1"/>
    <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
</service>

. 您还需要在 serviceMetaData 中将 httpGetEnabled 更改为 httpsGetEnabled。下面的代码显示了如何做到这一点:

<serviceMetadata httpsGetEnabled="true"/> 

希望它有所帮助

于 2013-02-08T09:19:36.783 回答
0

我已经在 3.5 设置中使用了您的确切配置,并且它适用于以下 Luuk 回答中提到的Transport模式使用。clientCredentialType="None"但为了确定起见,我继续创建了一个示例项目来模拟尽可能多的环境,因为我可以从这里的信息中收集到。

为了模拟您的环境,我将 IIS (7.5) 设置为使用标准Asp.Net 2.0 Integrated应用程序池。我添加了 3 个 http 绑定和 3 个 https 绑定,以模拟您的“每个方案问题只能有一个地址”并baseAddressPrefixFilters使用它。

我只搜索并替换mysite.comlocalhost. 下面是我用来生成屏幕截图的确切配置的复制粘贴:

网络配置

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" />
    <authentication mode="None"/>
    <customErrors mode="Off"/>
  </system.web>
  <system.serviceModel>
    <!--     -->
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true">
      <baseAddressPrefixFilters>
        <add prefix="https://localhost"/>
        <add prefix="http://localhost"/>
      </baseAddressPrefixFilters>
    </serviceHostingEnvironment>
    <!-- Set up Custom Behaviors -->
    <behaviors>
      <endpointBehaviors/>
      <serviceBehaviors>
        <behavior name="WebPostService.WebPostServiceBehavior">
          <serviceMetadata httpsGetEnabled="true" httpsGetUrl="WebPostServices.svc/mex"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <!-- Set up the binding configuration  -->
    <bindings>
      <wsHttpBinding>
        <binding name="SOAPBinding">
          <security mode="Transport">
            <transport clientCredentialType="None"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="WebPostService.WebPostServiceBehavior" name="WebPostService.WebPostService">
        <host>
          <baseAddresses>
            <add baseAddress="https://localhost/Services/WebPostService.svc"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="SOAPBinding" contract="WebPostService.IWebPostService">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
      </service>
    </services>
  </system.serviceModel>
</configuration>

结果如下:

截屏

您会注意到它在完整网址中WebPostService.svc出现了两次。mex你需要放弃httpsGetUrl只是mex而不是WebPostService.svc/mex(或完全放弃它,它在我这边仍然可以正常工作)

如果您想讨论这个或除了 IIS 版本之外我们的环境之间可能有什么不同,我几乎整天都在 WPF 聊天室(另外 5-6 小时)。

于 2013-02-07T12:16:24.057 回答