简体   繁体   中英

Going from http to https, getting "Could not find a base address that matches scheme http for the endpoint with binding WebHttpBinding"

here's a problem I'm struggling with:
The configuration below used to work fine (site's binding was http, port 81). It fails now, after the site's binding was changed to be https, port 443 and use a valid server authentication certificate. The error message in Event Viewer is this:

 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

web.config for "api" application:

<?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>

It looks like it expects "oauth2" to be an application itself which has its own web.config while it's just a part of the route and is supposed to be handled within "api". What needs to be changed in the web.config above to make it work properly?

If you want to use https, please refer to the following configuration:

<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>

在此处输入图像描述

To use https, you need to set the security mode to Transport.

UPDATE:

A screenshot of a binding:

在此处输入图像描述

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM