【问题标题】:Windows Service hosted WCF over HTTPSWindows 服务通过 HTTPS 托管 WCF
【发布时间】:2010-09-10 21:06:13
【问题描述】:

我已根据来自 MSDN 的these instructions 创建并配置了 SSL 证书。我收到this question 列出的错误消息,但不确定如何将该问题中接受的答案映射到我的 App.config 文件。配置文件的内容和服务本身在 http 上正常工作,只是在 https 上发生了问题。

我的App.config 文件目前是:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="TransportSecurity">
          <security mode="Transport">
            <transport clientCredentialType="None"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service name="LookupServiceHost" behaviorConfiguration="serviceBehaviour">
        <host>
          <baseAddresses>
            <add baseAddress="https://localhost:54321/MyService"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="wsHttpBinding" contract="ILookupService" bindingConfiguration="TransportSecurity" />
        <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="serviceBehaviour">
          <serviceMetadata httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="False"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

Windows 事件日志中返回的错误异常:

服务无法启动。 System.ServiceModel.AddressAlreadyInUseException:HTTP 无法注册 URL https://+:54321/MyService/。另一个应用程序已经用 HTTP.SYS 注册了这个 URL。 ---> System.Net.HttpListenerException: 无法监听前缀“https://+:54321/MyService/”,因为它与机器上的现有注册冲突。

有人可以告诉我如何启用它吗?

【问题讨论】:

  • 由于这是 .NET,您没有收到错误消息,而是收到了异常。请发布完整的例外情况。
  • @John,除了迂腐外,我确实声明我收到了与链接帖子相同的消息(IMO)。也就是说,我已在我的问题中添加了具体细节。

标签: c# windows-services wcf


【解决方案1】:

我认为您正在连接两个不同的设置。 Netsh 可用于为 SSL 添加证书,但也允许应用程序在给定端口上侦听,而无需在管理员帐户下运行。异常针对第二个设置。我以前没见过,但我假设您已经为 HTTP 注册了这个端口,所以让我们尝试在另一个端口上使用(并注册)HTTPS 或替换以前的注册。

编辑:

以提升的权限(以管理员身份)打开命令提示符。 首先检查 SSL 证书是否分配给正确的端口:

netsh http show sslcert

通过调用检查是否在该端口上注册了 HTTP 侦听:

netsh http show urlacl 

如果是这样,请使用以下命令删除该注册:

netsh http delete urlacl url=http://+:54321/MyService

再次添加注册以支持监听HTTPS:

netsh http add urlacl url=https://+:54321/MyService user=domain\userName

其中用户是用于运行 Windows 服务的帐户。如果它是本地帐户,则仅使用用户名。

注意: 在 https 下,似乎必须在 urlacl 中使用通配符。我们不能编写 https://localhost:8733/... 来匹配 Visual Studios 默认的 http urlacl。这可能是有道理的,因为请求的主机名在解密之后才可用。

【讨论】:

  • 您能否指出我应该对我的 .config 文件/netsh 注册进行哪些更改才能做到这一点?
  • 就是这样 - 我注册了错误的端口。将自己投入深渊显然不是处理 WCF 和 HTTPS 的最简单方法,尤其是在喝了一两杯酒之后! =)
【解决方案2】:

对于其他找到这篇文章的人来说,明显的原因不同,但症状相同。

我运行了一个“始终有效”的应用程序,并且在通过远程桌面或本地运行它的各种组合(未记录,因为我没有预料到问题)之后,登录和注销,并将其替换为重新编译但其他具有不同版本号的相同版本我得到相同的“另一个应用程序已经注册了此 URL ...等等等等”。

显然 (?) 注册是特定于运行的实例,并且在该应用程序关闭时持续存在。 (?) 无论如何,旧的 Windows 格言“当有疑问时重新启动”处理了它。在没有对应用程序本身进行任何更改的情况下,它就毫无怨言地运行了。取消注册等可能也会奏效。这是在 Windows 10 下 - 我从未在早期版本的 Windows 中看到过这种情况。

【讨论】:

    【解决方案3】:

    以管理员身份运行 Visual Studio 关闭 Visual Studio 应用程序并以管理员模式重新打开它,这样就可以了,错误消失了。在非管理员模式下运行 Visual Studio 时会发生 HTTP 错误

    【讨论】:

    • 以管理员身份运行 Visual Studio几乎从不是正确的答案。以管理员身份运行anything几乎永远不会是正确的答案。接受的答案详细说明了执行此操作的正确方法。如果您以管理员身份运行 Visual Studio,您的代码可能需要以管理员身份在生产环境中运行 - 这不是您应该或不想成为的地方
    • 当我不在管理员模式下调试项目时,我总是会收到此错误,一旦我关闭解决方案并以管理员模式打开 VS 并调试该错误永远不会发生
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 2011-08-09
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    相关资源
    最近更新 更多