代码之家  ›  专栏  ›  技术社区  ›  Rob

Windows服务通过HTTPS承载WCF

  •  19
  • Rob  · 技术社区  · 15 年前

    我已根据创建和配置了一个SSL证书 these instructions 来自MSDN。我收到错误消息 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/ . 另一个应用程序已将此URL注册到http.sys。--->system.net.httpListenerException:未能侦听前缀' https://+:54321/myservice/ '因为它与计算机上现有的注册冲突。

    有人能给我一个如何启用这个的指针吗?

    3 回复  |  直到 7 年前
        1
  •  26
  •   Oskar Berggren    11 年前

    我想你正在连接两个不同的设置。netsh可以用来为ssl添加证书,也可以允许应用程序在给定端口上侦听而不在admin帐户下运行。异常以第二个设置为目标。我以前没有见过,但是我假设您已经为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的默认urlacl for HTTP。这可能是有意义的,因为请求的主机名在解密之后才可用。

        2
  •  0
  •   MickeyfAgain_BeforeExitOfSO    9 年前

    不同的表面原因,但相同的症状,对于其他人谁找到了这个职位。

    我运行了一个“始终有效”的应用程序,在通过远程桌面或本地运行它、登录和注销以及用重新编译但版本相同的版本替换它的各种组合(由于我没有预料到问题,所以没有记录)之后,我得到了相同的版本号“另一个应用程序已经注册了是url…blah,blah”。

    显然(?)注册是特定于运行的实例的,并在应用程序关闭时持续进行。(?)无论如何,旧的Windows格言“有疑问时重新启动”处理了它。在应用程序本身没有任何变化的情况下,它运行时没有任何抱怨。可能注销等也会起作用。这是在Windows10下-我从来没有在早期版本的Windows中看到过。

        3
  •  -1
  •   Lavanya    7 年前

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