«Регистрация для URI уже существует» при размещении одного и того же сервиса для HTTPS и HTTP - PullRequest
7 голосов
/ 07 декабря 2010

Я пытаюсь разместить один и тот же сервис на одном и том же веб-сайте, используя две конечные точки: одну HTTP и другую HTTPS.

Проблема в том, что я могу с радостью позвонить в одну службу (какая бы программа мне ни позвонила в первую очередь), но затем не удается дозвониться до другой, пока я не сброслю и не попробую снова. Так что я могу счастливо звонить обоим, но по одному, пока процесс не перезапустится.

Я исчерпал (или думаю, что у меня есть) все соответствующие вопросы и ответы и документы, которые я смог найти, и ни один из них, похоже, не помог мне. Уровень документации MSDN относительно этих случаев (который должен быть широко распространенным) ужасен, и ничто не работает, как кажется.

Я безуспешно использовал Host / BaseAddresses / BaseAddress, и всякий раз, когда я его использовал, я получаю другую ошибку (не могу найти схему HTTPS).

У меня есть папка с именем Secure, которая включена для HTTPS внутри IIS.

Я отключил mex, поэтому никакие метаданные, которые я получил, прошли мимо предыдущих ошибок.

Кто-нибудь получил подсказку? Я бестолковый ...

  <service name="Namespace.MyService" behaviorConfiguration="MyBehaviour">
    <host>
      <baseAddresses>
      </baseAddresses> 
    </host> 
    <endpoint address="http://localhost/Services/MyService.svc/MyService"
              name="MyService"   binding="wsHttpBinding"
              bindingConfiguration="myWsHttpBinding" contract="Namespace.IMyService" />

    <endpoint address="https://localhost/Services/Secure/MySslService.svc/MySslService"
              name="MySslService"   binding="basicHttpBinding"
              bindingConfiguration="MySslServiceBinding" contract="Namespace.IMyService" />
  </service>

.....

   <behavior name="MyBehaviour">
      <custom1/>
      <custom2/>
      <serviceMetadata httpGetEnabled="false" />
      <serviceDebug includeExceptionDetailInFaults="false"/>
      <serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="CustomProvider"/>
      <serviceCredentials>
        <serviceCertificate findValue="Some" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />

        <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="SomeClass, SomeDll"/>
      </serviceCredentials>
    </behavior>

Исходная ошибка:

Регистрация для URI уже существует «http://localhost/Services/....'.

Описание: необработанное исключение произошло во время исполнения текущий веб-запрос. Пожалуйста, просмотрите трассировка стека для получения дополнительной информации о ошибка и откуда она возникла код.

Сведения об исключении: System.InvalidOperationException: A регистрация уже существует для URI «http://localhost/Services/....'.

Ошибка источника:

Создано необработанное исключение во время исполнения текущего веб-запрос. Информация относительно Происхождение и место исключения можно определить с помощью исключения трассировка стека ниже.

Трассировка стека:

[InvalidOperationException: A регистрация уже существует для URI
System.ServiceModel.Channels.UriPrefixTable 1.RegisterUri(Uri uri, HostNameComparisonMode hostNameComparisonMode, TItem item) +320 System.ServiceModel.Channels.HttpTransportManager.Register(TransportChannelListener channelListener) +380<br> System.ServiceModel.Channels.TransportManager.Open(TransportChannelListener channelListener) +816<br> System.ServiceModel.Channels.TransportManagerContainer.Open(SelectTransportManagersCallback selectTransportManagerCallback) +121<br> System.ServiceModel.Channels.HttpChannelListener.OnOpen(TimeSpan timeout) +125<br> System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) +789<br> System.ServiceModel.Channels.DatagramChannelDemuxer 2.OnOuterListenerOpen (ChannelDemuxerFilter фильтр, слушатель IChannelListener, TimeSpan timeout) + 606
System.ServiceModel.Channels.SingletonChannelListener`3.OnOpen (TimeSpan тайм-аут) + 91
System.ServiceModel.Channels.CommunicationObject.Open (TimeSpan тайм-аут) + 789
System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen (TimeSpan тайм-аут) + 375

Вот ошибка журнала трассировки WCF:

ChannelDispatcher на http://localhost/Services/...' с контракт (ы) "IMyService" не может открыть его IChannelListener. System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen (TimeSpan тайм-аут) System.ServiceModel.Channels.CommunicationObject.Open (TimeSpan тайм-аут) System.ServiceModel.ServiceHostBase.OnOpen (TimeSpan тайм-аут) System.ServiceModel.Channels.CommunicationObject.Open (TimeSpan тайм-аут) System.ServiceModel.ServiceHostingEnvironment.HostingManager.ActivateService (String normalizedVirtualPath) System.ServiceModel.ServiceHostingEnvironment.HostingManager.EnsureServiceAvailable (String normalizedVirtualPath) System.ServiceModel.ServiceHostingEnvironment.EnsureServiceAvailableFast (String relativeVirtualPath) System.ServiceModel.Activation.HostedHttpRequestAsyncResult.HandleRequest () System.ServiceModel.Activation.HostedHttpRequestAsyncResult.BeginRequest () System.ServiceModel.Activation.HostedHttpRequestAsyncResult.OnBeginRequest (Объект государство) System.ServiceModel.AspNetPartialTrustHelpers.PartialTrustInvoke (ContextCallback обратный вызов, состояние объекта) System.ServiceModel.Activation.HostedHttpRequestAsyncResult.OnBeginRequestWithFlow (Объект государство) System.Runtime.IOThreadScheduler.ScheduledOverlapped.IOCallback (UInt32 errorCode, UInt32 numBytes, NativeOverlapped * nativeOverlapped) System.Runtime.Fx.IOCompletionThunk.UnhandledExceptionFrame (UInt32 ошибка, UInt32 bytesRead, NativeOverlapped * nativeOverlapped) System.Threading._IOCompletionCallback.PerformIOCompletionCallback (UInt32 errorCode, UInt32 numBytes, NativeOverlapped * POVERLAP)

Ответы [ 2 ]

3 голосов
/ 18 марта 2011

ОК, я исправил свою проблему.Проблема заключалась в том, что у меня сложилось впечатление, что мне нужно создать безопасную папку в IIS и поместить туда файл .svc, чтобы гарантировать передачу SSL.Оказалось, что это не так, и все, что мне нужно было сделать, это использовать один и тот же файл .svc и просто определить 2 конечные точки:

<endpoint address="http://localhost/Services/MyService.svc/MyService"
          name="MyService"   binding="wsHttpBinding"
          bindingConfiguration="myWsHttpBinding" contract="Namespace.IMyService" />

<endpoint address="https://localhost/Services/MyService.svc/MySecureService"
          name="MySslService"   binding="basicHttpBinding"
          bindingConfiguration="MySslServiceBinding" contract="Namespace.IMyService" />
1 голос
/ 08 декабря 2010

Возможно, вложенные каталоги сбивают с толку IIS - у меня такое уже было, хотя и не в контексте WCF. Попробуйте изменить адреса конечной точки на:

address="http://localhost/MyService"
address="https://localhost/MySslService"

Можете ли вы попробовать разместить приложение из консольного приложения вместо IIS? Я почти уверен, что IIS как-то вызывает твою проблему, но это может подтвердить это.

Если это возможно, я бы также попытался изолировать проблему, удалив некоторые детали конфигурации - например, bindingConfiguration и поведениеConfiguration.

Очевидно, что это всего лишь шаги по отладке, которые я выполнил бы (возможно, уже), чтобы попытаться изолировать проблему - извините, у меня нет полного ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...