2013-09-25 82 views
0

我已經嘗試從其他問題實施一些建議來解決這個令人沮喪的問題。通常,當我在IIS中建立一個站點時,web應用程序對於傳輸層中發生的事情有點「不可知論」。但是,對於這個特定的應用程序,當我應用https綁定時,我無法使其工作。提供的URI方案'https'是無效的

我的web.config看起來像:

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="DefaultAPIBinding"> 
      <security mode="Transport"> 
      <transport clientCredentialType="None" proxyCredentialType="None" realm="" /> 
      <message clientCredentialType="Certificate" algorithmSuite="Default" /> 
      </security> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 
    </system.serviceModel> 

和我的Global.asax.cs看起來像

ContainerBuilder builder = new ContainerBuilder(); 

    //builder.Register<IContactRepository, ContactRepository>(); 
    builder.Register<IResourceFactory, Classes.LightCoreResourceFactory>(); 

    IContainer container = builder.Build(); 

    var configuration = HttpHostConfiguration.Create().SetResourceFactory(new LightCoreResourceFactory(container)); 

    RouteTable.Routes.MapServiceRoute<WebServiceResources>("ws", configuration); 

但每當我添加一個https綁定到我的IIS站點,我得到的錯誤:

The provided URI scheme 'https' is invalid; expected 'http'. 
Parameter name: context.ListenUriBaseAddress 

[ArgumentException: The provided URI scheme 'https' is invalid; expected 'http'. 
Parameter name: context.ListenUriBaseAddress] 
    System.ServiceModel.Channels.TransportChannelListener..ctor(TransportBindingElement bindingElement, BindingContext context, MessageEncoderFactory defaultMessageEncoderFactory, HostNameComparisonMode hostNameComparisonMode) +12800194 
    System.ServiceModel.Channels.HttpChannelListener..ctor(HttpTransportBindingElement bindingElement, BindingContext context) +41 
    System.ServiceModel.Channels.HttpChannelListener`1..ctor(HttpTransportBindingElement bindingElement, BindingContext context) +28 
    System.ServiceModel.Channels.HttpTransportBindingElement.BuildChannelListener(BindingContext context) +133 
    System.ServiceModel.Channels.BindingContext.BuildInnerChannelListener() +63 
    Microsoft.ApplicationServer.Http.Channels.HttpMessageEncodingBindingElement.BuildChannelListener(BindingContext context) +90 
    System.ServiceModel.Channels.BindingContext.BuildInnerChannelListener() +63 
    Microsoft.ApplicationServer.Http.Channels.HttpMessageHandlerBindingElement.BuildChannelListener(BindingContext context) +158 
    System.ServiceModel.Channels.BindingContext.BuildInnerChannelListener() +63 
    System.ServiceModel.Channels.Binding.BuildChannelListener(Uri listenUriBaseAddress, String listenUriRelativeAddress, ListenUriMode listenUriMode, BindingParameterCollection parameters) +125 
    System.ServiceModel.Description.DispatcherBuilder.MaybeCreateListener(Boolean actuallyCreate, Type[] supportedChannels, Binding binding, BindingParameterCollection parameters, Uri listenUriBaseAddress, String listenUriRelativeAddress, ListenUriMode listenUriMode, ServiceThrottle throttle, IChannelListener& result, Boolean supportContextSession) +336 
    System.ServiceModel.Description.DispatcherBuilder.BuildChannelListener(StuffPerListenUriInfo stuff, ServiceHostBase serviceHost, Uri listenUri, ListenUriMode listenUriMode, Boolean supportContextSession, IChannelListener& result) +716 
    System.ServiceModel.Description.DispatcherBuilder.InitializeServiceHost(ServiceDescription description, ServiceHostBase serviceHost) +1131 
    System.ServiceModel.ServiceHostBase.InitializeRuntime() +65 
    System.ServiceModel.ServiceHostBase.OnBeginOpen() +34 
    System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout) +50 
    System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) +310 
    System.ServiceModel.Channels.CommunicationObject.Open() +36 
    System.ServiceModel.HostingManager.ActivateService(ServiceActivationInfo serviceActivationInfo, EventTraceActivity eventTraceActivity) +91 
    System.ServiceModel.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath, EventTraceActivity eventTraceActivity) +598 

[ServiceActivationException: The service '/ws' cannot be activated due to an exception during compilation. The exception message is: The provided URI scheme 'https' is invalid; expected 'http'. 
Parameter name: context.ListenUriBaseAddress.] 
    System.Runtime.AsyncResult.End(IAsyncResult result) +495736 
    System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End(IAsyncResult result) +178 
    System.ServiceModel.Activation.AspNetRouteServiceHttpHandler.EndProcessRequest(IAsyncResult result) +6 
    System.Web.CallHandlerExecutionStep.OnAsyncHandlerCompletion(IAsyncResult ar) +129 

由於錯誤消息沒有在我的代碼中提供位置來檢查或其他提示,因爲我已經實施了一些關於如何解決這個問題的建議,所以我很茫然。任何想法,我可以做什麼,使這個應用程序允許https綁定?

+0

但你得到一個堆棧跟蹤?如何張貼這一點。 – shriek

+0

肯定的事情......好點 –

+0

「但是,無論何時我向我的IIS站點添加一個https綁定,我都會收到錯誤消息:」您能澄清如何將https綁定添加到您的IIS站點嗎?通過IIS本身還是? – Haney

回答

1

要闡述什麼@thedr說,這裏是我們所做的事情:

  1. 升級到MVC4如果你還沒有這樣做的話
  2. 添加下面的類從this CodePlex discussion
直扯下
public class HttpsServiceHostFactory : HttpConfigurableServiceHostFactory 
{ 
    public override ServiceHostBase CreateServiceHost(string constructorString, Uri[] baseAddresses) 
    { 

     var host = base.CreateServiceHost(constructorString, baseAddresses); 

     foreach (var httpBinding in from serviceEndpoint in host.Description.Endpoints 
            where serviceEndpoint.ListenUri.Scheme == "https" 
            select (HttpBinding)serviceEndpoint.Binding) 
     { 
      httpBinding.Security.Mode = HttpBindingSecurityMode.Transport; 
     } 

     return host; 
    } 
} 

然後當你做RouteTable.Routes.MapServiceRoute,它應該看起來像

RouteTable.Routes. 
     MapServiceRoute<WebServiceResources, HttpsServiceHostFactory>("ws", configuration); 
相關問題