如何在 HTTP 和 HTTPS 中侦听自托管 Azure 中继端点?

Posted

技术标签:

【中文标题】如何在 HTTP 和 HTTPS 中侦听自托管 Azure 中继端点?【英文标题】:How to listen self-hosted Azure Relay endpoint in both HTTP & HTTPS? 【发布时间】:2018-12-24 23:37:26 【问题描述】:

我正在尝试使用 Azure WCF 中继,通过 ServiceHost 实例创建我的侦听器。它运行良好,但我无法使其同时在 HTTP 和 HTTPS 中运行。我知道这看起来很奇怪,但这是我的要求。

这是我的代码:

Uri httpUri = ServiceBusEnvironment.CreateServiceUri(Uri.UriSchemeHttp, "MYNAMESPACE", "TEST");
Uri httpsUri = ServiceBusEnvironment.CreateServiceUri(Uri.UriSchemeHttps, "MYNAMESPACE", "TEST");
WebServiceHost sh = new WebServiceHost(typeof(TestAPI), httpsUri, httpUri);
sh.Open();

这是我的conf:

<bindings>
  <webHttpRelayBinding>
    <binding name="https" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" transferMode="Streamed" sendTimeout="00:15:00">
      <security mode="Transport" relayClientAuthenticationType="None"/>
    </binding>
    <binding name="http" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" transferMode="Streamed" sendTimeout="00:15:00">
      <security mode="None" relayClientAuthenticationType="None"/>
    </binding>
  </webHttpRelayBinding>
</bindings>
<services>
  <service name="TestAPI" behaviorConfiguration="default">
    <endpoint name="MobileEndpointHttps" contract="ITestAPI" binding="webHttpRelayBinding" bindingConfiguration="https" behaviorConfiguration="sbTokenProviderTest" address="" />
    <endpoint name="MobileEndpoint" contract="ITestAPI" binding="webHttpRelayBinding" bindingConfiguration="http" behaviorConfiguration="sbTokenProviderTest" address="" />
  </service>
</services>
<behaviors>
  <endpointBehaviors>
    <behavior name="sbTokenProviderTest">
      <webHttp/>
      <serviceRegistrySettings discoveryMode="Public" />
      <transportClientEndpointBehavior>
        <tokenProvider>
          <sharedAccessSignature keyName="RootManageSharedAccessKey" key="MYKEY"/>
        </tokenProvider>
      </transportClientEndpointBehavior>
    </behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior name="default">
      <serviceDebug httpHelpPageEnabled="false" httpsHelpPageEnabled="false"/>
      <serviceMetadata httpGetEnabled="false" httpsGetEnabled="false" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />

httpGetEnabled 和 httpsGetEnabled 似乎不需要让它单独工作,所以我禁用了它以避免 netsh 警告。

使用此配置,我收到以下错误:

System.InvalidOperationException:位于“sb://mynamespace.servicebus.windows.net/TEST/”的 ChannelDispatcher 与合同“ITestAPI”无法打开其 IChannelListener。 ---> System.InvalidOperationException:已存在注册 Uri 'sb://mynamespace.servicebus.windows.net/TEST/'。

至少有可能吗?需要你的帮助:(

【问题讨论】:

【参考方案1】:

如果您只是创建一个安全模式为“None”且 relayClientAuthenticationType="None" 的端点,它不接受 HTTP 和 HTTPS 上的流量吗?

【讨论】:

以上是关于如何在 HTTP 和 HTTPS 中侦听自托管 Azure 中继端点?的主要内容,如果未能解决你的问题,请参考以下文章

Owin 自主机 - 无法侦听前缀“http://localhost:12345/”,因为它与机器上的现有注册冲突

如何解决 C# IIS 托管的 WCF NET TCP 服务超时问题

AWS CloudFormation Application Load Balancer - 如何将 HTTP 侦听器重定向到 HTTPS 侦听器?

wcf 由 http 更改为 https 返回404,没有终结点在侦听可以接受消息的

自托管 WCF 服务中的 HTTP 413 请求实体太大

如何在 asp.net 自托管 API 中启用 CORS?