Демонстрация «Настройка служб с помощью конечных точек» не работает (Microsoft / endpoint.tv / Pluralsight) - PullRequest
6 голосов
/ 25 октября 2011

Я пытаюсь следовать демонстрационным видео на странице WCF для начинающих на MSDN .

Первое видео работало более или менее нормально. Я сейчас ближе к концу второго видео. Я использую VS2010 / .NET 4.0, в то время как видео, кажется, использует VS2008 (я предполагаю .NET 3.5, но я не помню).

Я использую следующую демонстрацию

Мы только что добавили еще 3 конечные точки: обычный http, net.tcp и net.pipe. Когда я пытаюсь запустить проект, веб-служба не запускается.

System.InvalidOperationException: Cannot load the X.509 certificate identity specified in the configuration.
   at System.ServiceModel.Description.ConfigLoader.LoadIdentity(IdentityElement element)
   at System.ServiceModel.Description.ConfigLoader.LoadServiceDescription(ServiceHostBase host, ServiceDescription description, ServiceElement serviceElement, Action`1 addBaseAddress)
   at System.ServiceModel.ServiceHostBase.LoadConfigurationSectionInternal(ConfigLoader configLoader, ServiceDescription description, ServiceElement serviceSection)
   at System.ServiceModel.ServiceHostBase.LoadConfigurationSectionInternal(ConfigLoader configLoader, ServiceDescription description, String configurationName)
   at System.ServiceModel.ServiceHostBase.ApplyConfiguration()
   at System.ServiceModel.ServiceHostBase.InitializeDescription(UriSchemeKeyedCollection baseAddresses)
   at System.ServiceModel.ServiceHost.InitializeDescription(Type serviceType, UriSchemeKeyedCollection baseAddresses)
   at System.ServiceModel.ServiceHost..ctor(Type serviceType, Uri[] baseAddresses)
   at Microsoft.Tools.SvcHost.ServiceHostHelper.CreateServiceHost(Type type, ServiceKind kind)
   at Microsoft.Tools.SvcHost.ServiceHostHelper.OpenService(ServiceInfo info)

Исходя из моего Google fu, я наткнулся на эту тему: "Невозможно загрузить идентификатор сертификата X.509, указанный в конфигурации"

Я действительно пока не хотел связываться с сертификатами, так как я все еще просто экспериментирую с основами, поэтому я последовал совету в этом посте и просто добавил тег <dns value="localhost" />. Исключение меняется:

Please try changing the HTTP port to 8732 or running as Administrator.
System.ServiceModel.AddressAccessDeniedException: HTTP could not register URL http://+:8080/EvalService/. Your process does not have access rights to this namespace (see http://go.microsoft.com/fwlink/?LinkId=70353 for details). ---> System.Net.HttpListenerException: Access is denied
   at System.Net.HttpListener.AddAllPrefixes()
   at System.Net.HttpListener.Start()
   at System.ServiceModel.Channels.SharedHttpTransportManager.OnOpen()
   --- End of inner exception stack trace ---
   at System.ServiceModel.Channels.SharedHttpTransportManager.OnOpen()
   at System.ServiceModel.Channels.TransportManager.Open(TransportChannelListener channelListener)
   at System.ServiceModel.Channels.TransportManagerContainer.Open(SelectTransportManagersCallback selectTransportManagerCallback)
   at System.ServiceModel.Channels.TransportChannelListener.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Channels.HttpChannelListener.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at System.ServiceModel.Channels.DatagramChannelDemuxer`2.OnOuterListenerOpen(ChannelDemuxerFilter filter, IChannelListener listener, TimeSpan timeout)
   at System.ServiceModel.Channels.SingletonChannelListener`3.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at System.ServiceModel.Security.NegotiationTokenAuthenticator`1.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Security.WrapperSecurityCommunicationObject.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at System.ServiceModel.Security.CommunicationObjectSecurityTokenAuthenticator.Open(TimeSpan timeout)
   at System.ServiceModel.Security.SecurityUtils.OpenCommunicationObject(ICommunicationObject obj, TimeSpan timeout)
   at System.ServiceModel.Security.SecurityUtils.OpenTokenAuthenticatorIfRequired(SecurityTokenAuthenticator tokenAuthenticator, TimeSpan timeout)
   at System.ServiceModel.Security.SecurityProtocolFactory.Open(String propertyName, Boolean requiredForForwardDirection, SecurityTokenAuthenticator authenticator, TimeSpan timeout)
   at System.ServiceModel.Security.SymmetricSecurityProtocolFactory.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Security.WrapperSecurityCommunicationObject.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at System.ServiceModel.Security.SecurityProtocolFactory.Open(Boolean actAsInitiator, TimeSpan timeout)
   at System.ServiceModel.Security.SecurityListenerSettingsLifetimeManager.Open(TimeSpan timeout)
   at System.ServiceModel.Channels.SecurityChannelListener`1.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at System.ServiceModel.Security.SecuritySessionSecurityTokenAuthenticator.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Security.WrapperSecurityCommunicationObject.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at System.ServiceModel.Security.CommunicationObjectSecurityTokenAuthenticator.Open(TimeSpan timeout)
   at System.ServiceModel.Security.SecurityUtils.OpenCommunicationObject(ICommunicationObject obj, TimeSpan timeout)
   at System.ServiceModel.Security.SecurityUtils.OpenTokenAuthenticatorIfRequired(SecurityTokenAuthenticator tokenAuthenticator, TimeSpan timeout)
   at System.ServiceModel.Security.SecuritySessionServerSettings.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Security.WrapperSecurityCommunicationObject.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at System.ServiceModel.Security.SecuritySessionServerSettings.Open(TimeSpan timeout)
   at System.ServiceModel.Security.SecurityListenerSettingsLifetimeManager.Open(TimeSpan timeout)
   at System.ServiceModel.Channels.SecurityChannelListener`1.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at System.ServiceModel.Channels.CommunicationObject.Open()
   at Microsoft.Tools.SvcHost.ServiceHostHelper.OpenService(ServiceInfo info)
System.Net.HttpListenerException (0x80004005): Access is denied
   at System.Net.HttpListener.AddAllPrefixes()
   at System.Net.HttpListener.Start()
   at System.ServiceModel.Channels.SharedHttpTransportManager.OnOpen()

Итак, я попытался сделать то, что он сказал: изменив порт на 8732, но исключение по-прежнему выдается, на этот раз говоря Please try changing the HTTP port to 8732...HTTP could not register URL http://+:8732/EvalService/.... : P

Я пытался закомментировать новые конечные точки безрезультатно. Даже оригинальные не с этой ошибкой. Не имеет значения, если я верну их в исходный порт [не так] 1337.

Вот App.config, и ничто не выделяется как проблемное:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.web>
    <compilation debug="true" />
  </system.web>
  <system.serviceModel>
    <services>
      <service name="EvalServiceLibrary.EvalService">
        <clear />
        <endpoint address="ws" binding="wsHttpBinding" contract="EvalServiceLibrary.IEvalService"
          listenUriMode="Explicit">
          <identity>
            <dns value="localhost" />
            <certificateReference storeName="My" storeLocation="LocalMachine"
              x509FindType="FindBySubjectDistinguishedName" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"
          listenUriMode="Explicit">
          <identity>
              <dns value="localhost" />
              <certificateReference storeName="My" storeLocation="LocalMachine"
              x509FindType="FindBySubjectDistinguishedName" />
          </identity>
        </endpoint>
        <endpoint address="basic" binding="basicHttpBinding" contract="EvalServiceLibrary.IEvalService"
          listenUriMode="Explicit">
          <identity>
            <dns value="localhost" />
            <certificateReference storeName="My" storeLocation="LocalMachine"
              x509FindType="FindBySubjectDistinguishedName" />
          </identity>
        </endpoint>
        <endpoint address="net.tcp://localhost:8888/EvalService" binding="netTcpBinding"
          contract="EvalServiceLibrary.IEvalService" listenUriMode="Explicit">
          <identity>
            <dns value="localhost" />
            <certificateReference storeName="My" storeLocation="LocalMachine"
              x509FindType="FindBySubjectDistinguishedName" />
          </identity>
        </endpoint>
        <endpoint address="net.pipe://localhost/EvalService" binding="netNamedPipeBinding"
          bindingConfiguration="" contract="EvalServiceLibrary.IEvalService" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8080/EvalService" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

Что не так / как мне это исправить?

Ответы [ 6 ]

7 голосов
/ 27 февраля 2012

Я тоже следовал той же веб-трансляции и у меня были те же проблемы. Я обошел проблему с сертификатом, комментируя эти записи, как это было предложено другими.

Я исправил «Пожалуйста, попробуйте изменить порт HTTP на 8732 или запустить от имени администратора», добавив «Design_Time_Addresses» обратно в мой URL

Не работает

<add baseAddress="http://localhost:8732/AMessageService" />

Works!

<add baseAddress="http://localhost:8732/Design_Time_Addresses/AMessageService" />
3 голосов
/ 27 октября 2011

По-видимому, работающее решение для последней из двух вышеуказанных проблем (HTTP could not register URL одна) можно найти в VS2010 Training Kit , размещенном в комментариях к ответу Gabobcat (им).

В четвертом упражнении «Ex4-ServiceDiscovery» вам дается то, что кажется приложением чата, которое использует службы WCF для связи между двумя клиентами. Он использует функцию обнаружения для поиска пиров в сети. Короче говоря, то же самое исключение возникает при первоначальной попытке запустить завершенное приложение (после заполнения событий обнаружения, как изложено в упражнении). В комплект Учебного комплекта входит несколько пакетных сценариев (которые AFAICT использует лицензию Microsoft «с открытым исходным кодом», поэтому я должен иметь возможность поделиться этими сценариями) для установки или удаления «списков ACL для URL». На практике они представляются единственной (полезной) командой:

Файл: AddURLACL.cmd

@Echo Off
@Echo Grant permissions for URL reservation
@Echo Parameter 1 "%1" == port
@Echo Parameter 2 "%2" == URL
pause
netsh http add urlacl url=http://+:%1/%2 user=%USERDOMAIN%\%USERNAME%

Файл: DelURLACL.cmd

@Echo Off
@Echo Deletes permissions for URL reservation
@Echo Parameter 1 "%1" == port
@Echo Parameter 2 "%2" == URL
pause
netsh http delete urlacl url=http://+:%1/%2

Очевидно, что netsh команды - единственные, которые имеют значение. В примере проекта вы используете следующую команду (из окна командной строки «Запуск от имени администратора»), чтобы «исправить» это исключение:

C:\VS2010TrainingKit\Labs\WhatsNewInWCF4\Source\Setup\AddURLACL.cmd 8000

(Я использовал абсолютный путь, чтобы показать вам, где в Учебном комплекте вы могли найти эти сценарии; лично я находился в каталоге WhatsNewInWCF4 \ Source, когда делал это)

Строка 8000 встречается только 1 раз на протяжении всего проекта:

C:\VS2010TrainingKit\Labs\WhatsNewInWCF4\Source\Ex4-ServiceDiscovery\Begin\C#>findstr /n /s "8000" *
DiscoveryChat\SimpleChat.cs:376:            this.localAddress = new Uri("http://localhost:8000/" + Guid.NewGuid().ToString());

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

Я еще не экспериментировал с этим, но, похоже, он "исправил" мой проект EvalService (когда я изменил порт на 8000). В настоящее время большинство удаленных конечных точек удалены (осталась только конечная точка basicHttpBinding), а для baseAddress установлено значение localhost:8000.

Дайте мне знать, если это работает и для вас.

1 голос
/ 08 апреля 2012

Я был разочарован тем же вопросом. Наконец, я сам нашел решение, запустив Visual Studio от имени администратора, щелкнув правой кнопкой мыши Visual Studio 2010 и выбрав «Запуск от имени администратора».

1 голос
/ 25 октября 2011

Проблема в вашей конфигурации. Вы ссылаетесь на сертификаты в своих конечных точках. Либо вы удалите их:

<certificateReference storeName="My" storeLocation="LocalMachine" x509FindType="FindBySubjectDistinguishedName" />

Или вы помещаете несколько сертификатов в свой магазин сертификатов На этом этапе я рекомендую удалить разделы конфигурации «удостоверения», пока вы не узнаете немного больше о нашем WCF. Старайтесь просто использовать базовую конфигурацию конечных точек для начинающих и начните с того, что вы понимаете основы WCF. WCF предоставляет вам большой (действительно большой) набор параметров конфигурации в зависимости от ваших конкретных потребностей.

Возможно, эти ссылки помогут вам перейти в WCF лучше, чем видео, которые вы смотрели:

Надеюсь, это поможет.

0 голосов
/ 19 декабря 2013

Для запуска с правами администратора щелкните правой кнопкой мыши Visual Studio и выберите «Запуск от имени администратора» из контекстного меню. Чтобы все время работать от имени администратора, щелкните правой кнопкой мыши Visual Studio, затем перейдите к свойствам в контекстном меню. Перейдите на вкладку совместимости, затем выберите Запустить эту программу от имени администратора.

0 голосов
/ 25 февраля 2013

Думаю, я бы добавил обновленный сводный ответ из того, что я читал.

Несмотря на то, что мы можем пойти на все, чтобы разрешить разрешения с сертификатом, большинство людей, читающих это, на самом деле просто хотят, чтобы конечные точки WCF были запущены и работали как можно скорее.

Таким образом, несколько вариантов.

1. sudipto-kumar-mukherjee above states "I was frustated with the same issue. 
Finally I found the solution by myself by running the Visual Studio as Administrator 
by right clicking Visual Studio 2010 and choosing 'Run As Administrator'."   
--> Yes,  this     will work.
OR
2. nasp.tech response with 
"Doesn't Work"
<add baseAddress="http://localhost:8732/AMessageService" />
"Works!"
<add baseAddress="http://localhost:8732/Design_Time_Addresses/AMessageService" />

Похоже, что любой из этих способов - самый быстрый способ начать работу с этой проблемой.

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