从 http 到 https,得到“找不到与绑定 WebHttpBinding 的端点的方案 http 匹配的基地址”

Posted

技术标签:

【中文标题】从 http 到 https,得到“找不到与绑定 WebHttpBinding 的端点的方案 http 匹配的基地址”【英文标题】:Going from http to https, getting "Could not find a base address that matches scheme http for the endpoint with binding WebHttpBinding" 【发布时间】:2021-07-29 09:08:12 【问题描述】:

这是我正在努力解决的一个问题: 下面的配置可以正常工作(站点的绑定是 http,端口 81)。现在它失败了,在站点的绑定更改为 https、端口 443 并使用有效的服务器身份验证证书之后。事件查看器中的错误消息是这样的:

 WebHost failed to process a request.
 Sender Information: System.ServiceModel.ServiceHostingEnvironment+HostingManager/25652103
 Exception: System.ServiceModel.ServiceActivationException: The service '/services/api/oauth2' cannot be activated due to an exception during compilation.  The exception message is: Could not find a base address that matches scheme http for the endpoint with binding WebHttpBinding. Registered base address schemes are [https].. ---> System.InvalidOperationException: Could not find a base address that matches scheme http for the endpoint with binding WebHttpBinding. Registered base address schemes are [https].
   at System.ServiceModel.ServiceHostBase.MakeAbsoluteUri(Uri relativeOrAbsoluteUri, Binding binding, UriSchemeKeyedCollection baseAddresses)
   at System.ServiceModel.Description.ConfigLoader.ConfigureEndpointAddress(ServiceEndpointElement serviceEndpointElement, ServiceHostBase host, ServiceEndpoint endpoint)
   at System.ServiceModel.Description.ConfigLoader.ConfigureEndpoint(StandardEndpointElement standardEndpointElement, ServiceEndpointElement serviceEndpointElement, ContextInformation context, ServiceHostBase host, ServiceDescription description, ServiceEndpoint& endpoint, Boolean omitSettingEndpointAddress)
   at System.ServiceModel.Description.ConfigLoader.LookupEndpoint(ServiceEndpointElement serviceEndpointElement, ContextInformation context, ServiceHostBase host, ServiceDescription description, Boolean omitSettingEndpointAddress)
   at System.ServiceModel.Web.WebServiceHost.AddAutomaticWebHttpBindingEndpoints(ServiceHost host, IDictionary`2 implementedContracts, String multipleContractsErrorMessage, String noContractErrorMessage, String standardEndpointKind)
   at System.ServiceModel.Web.WebServiceHost.OnOpening()
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at System.ServiceModel.ServiceHostingEnvironment.HostingManager.ActivateService(ServiceActivationInfo serviceActivationInfo, EventTraceActivity eventTraceActivity)
   at System.ServiceModel.ServiceHostingEnvironment.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath, EventTraceActivity eventTraceActivity)
   --- End of inner exception stack trace ---
   at System.ServiceModel.ServiceHostingEnvironment.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath, EventTraceActivity eventTraceActivity)
   at System.ServiceModel.ServiceHostingEnvironment.EnsureServiceAvailableFast(String relativeVirtualPath, EventTraceActivity eventTraceActivity)
 Process Name: w3wp

“api”应用程序的 web.config:

<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <bindings>
      <webHttpBinding>
        <binding name="tinCanBinding" closeTimeout="00:01:00">
        </binding>
      </webHttpBinding>
    </bindings>
    <extensions>
      <behaviorExtensions>
        <add name="tinCanWebHttp" type="Company.RestService.TinCan.RestConfiguration.TinCanWebHttpBehaviorExtension, Company.RestService" />
        <add name="ErrorHandler" type="Company.RestService.ApiErrorHandlerBehavior, Company.RestService" />
      </behaviorExtensions>
    </extensions>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="true" />
          <ErrorHandler />
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="tinCanBehavior">
          <tinCanWebHttp />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <services>
      <service name="Company.RestService.TinCan.TinCanService">
        <endpoint address="" behaviorConfiguration="tinCanBehavior" bindingConfiguration="tinCanBinding" binding="webHttpBinding" contract="Company.RestService.ServiceContracts.TinCan.ITinCanService">
        </endpoint>
      </service>
      <service name="Company.RestService.CallBackRestService">
        <endpoint address="" binding="wsDualHttpBinding" contract="Company.RestService.ICallBackService">
        </endpoint>
      </service>
    </services>
    <standardEndpoints>
      <webHttpEndpoint>
        <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="false">
        </standardEndpoint>
      </webHttpEndpoint>
    </standardEndpoints>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="DSPExceptionModule" />
      <remove name="DSPThrottleModule" />
      <remove name="DSPTraceModule" />
      <remove name="DSPAuthenticationModule" />
      <add type="Company.ServiceHttpModule.DSPExceptionModule,Company.ServiceHttpModule" name="DSPExceptionModule" />
      <add type="Company.ServiceHttpModule.DSPThrottleModule,Company.ServiceHttpModule" name="DSPThrottleModule" />
      <add type="Company.ServiceHttpModule.DSPTraceModule,Company.ServiceHttpModule" name="DSPTraceModule" />
      <add type="Company.ServiceHttpModule.DSPAuthenticationModule,Company.ServiceHttpModule" name="DSPAuthenticationModule" />
    </modules>
  </system.webServer>
  <system.web>
    <compilation debug="true" />
  </system.web>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="10.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Common.Logging.Core" publicKeyToken="af08829b84f0328e" culture="neutral" />
        <bindingRedirect oldVersion="3.0.0.0-3.4.1.0" newVersion="3.4.1.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

看起来它希望“oauth2”是一个应用程序本身,它有自己的 web.config,而它只是路由的一部分,应该在“api”中处理。需要在上面的 web.config 中进行哪些更改才能使其正常工作?

【问题讨论】:

【参考方案1】:

如果要使用https,请参考如下配置:

<system.serviceModel >
        <services>
            <service name="WcfService30.Service1"
                     behaviorConfiguration="ServiceBehaviour" >
                <endpoint address=""
                          binding="webHttpBinding"
                bindingConfiguration="webHttpTransportSecurity"
                behaviorConfiguration="web"
                contract="WcfService30.IService1" />
                <endpoint address="mex"
                          binding="mexHttpsBinding"
                          contract="IMetadataExchange" />
            </service>
        </services>
        <bindings>
            <webHttpBinding>
                <binding name="webHttpTransportSecurity">
                    <security mode="Transport" />
                </binding>
            </webHttpBinding>
        </bindings>
        <behaviors>
            <serviceBehaviors>
                <behavior name="ServiceBehaviour">
                    <serviceMetadata httpsGetEnabled="true"
                                     httpGetEnabled="false"/>
                    <serviceDebug includeExceptionDetailInFaults="false"/>
                </behavior>
            </serviceBehaviors>
            <endpointBehaviors>
                <behavior name="web">
                    <webHttp helpEnabled="true"/>
                </behavior>
            </endpointBehaviors>
        </behaviors>
        <serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
    </system.serviceModel>

要使用 https,您需要将安全模式设置为传输。

更新:

绑定截图:

【讨论】:

嘿丁鹏,感谢您的帮助。我尝试了您的解决方案 - 不幸的是它没有工作,我仍然收到相同的“找不到与方案 http 匹配的基地址”错误。 您能否分享您在用于测试的网站上的绑定屏幕截图?这是在网站上右键单击,然后“编辑绑定..”。还请分享您在“站点绑定”窗口中获得的每个绑定的“编辑...”屏幕截图。谢谢! 当服务在代码中创建和注册时,我必须以编程方式在服务绑定上设置传输安全模式。成功了,谢谢丁鹏

以上是关于从 http 到 https,得到“找不到与绑定 WebHttpBinding 的端点的方案 http 匹配的基地址”的主要内容,如果未能解决你的问题,请参考以下文章

从 HTTP 表单提交到 HTTPS 是不是安全?

Nginx 从“www”重定向到“non www”以及从“http”到“https”?

grafana 从 http 切换到 https

从 http:// 重定向到 https:// [重复]

从 HTTP 到 HTTPS 的跨域请求立即中止

Tomcat 不会从 HTTP 重定向到 HTTPS