Свойство HttpGetEnabled ServiceMetadataBehavior имеет значение true, а свойство HttpGetUrl является относительным адресом, но нет http baseadd

#wcf #silverlight-5.0

#wcf #silverlight-5.0

Вопрос:

У меня включена ADFS asp.net приложение mvc2 и настроено с привязкой HTTPS (номер порта: 443) в IIS. Сайт настроен как веб-сайт по умолчанию в IIS .У меня есть служба WCF: ChartsService.svc в asp.net проект mvc2, который используется для проекта silverlight, присутствующего в том же решении. После завершения тестирования в локальной среде разработки я развернул код в более высоких средах. Он работал без каких-либо проблем во всех средах. Внезапно на промежуточном сервере, когда я попытался запустить проект silverlight, я получаю ошибку WCF, как указано ниже:

Система.Исключение InvalidOperationException Для свойства HttpGetEnabled ServiceMetadataBehavior установлено значение true, а свойство HttpGetUrl является относительным адресом, но базового адреса http нет. Либо укажите базовый адрес http, либо задайте для HttpGetUrl абсолютный адрес.

 System.ServiceModel.ServiceActivationException: The service '/ChartsService.svc' cannot be activated due to an exception during compilation.  The exception message is: The HttpGetEnabled property of ServiceMetadataBehavior is set to true and the HttpGetUrl property is a relative address, but there is no http base address.  Either supply an http base address or set HttpGetUrl to an absolute address.. ---> System.InvalidOperationException: The HttpGetEnabled property of ServiceMetadataBehavior is set to true and the HttpGetUrl property is a relative address, but there is no http base address.  Either supply an http base address or set HttpGetUrl to an absolute address.
   at System.ServiceModel.Description.ServiceMetadataBehavior.CreateHttpGetEndpoints(ServiceDescription description, ServiceHostBase host, ServiceMetadataExtension mex)
   at System.ServiceModel.Description.DispatcherBuilder.InitializeServiceHost(ServiceDescription description, ServiceHostBase serviceHost)
   at System.ServiceModel.ServiceHostBase.InitializeRuntime()
   at System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout)
   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.Runtime.AsyncResult.End[TAsyncResult](IAsyncResult result)
   at System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End(IAsyncResult result)
   at System.Web.HttpApplication.CallHandlerExecutionStep.OnAsyncHandlerCompletion(IAsyncResult ar)
  

Промежуточный веб-сервер использует IIS7.0.
В настоящее время у меня есть следующая конфигурация в web.config:

 <behaviors>
        <serviceBehaviors>
            <behavior name="VATScan.Web.ChartsServiceBehavior">
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="true" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <services>
        <service behaviorConfiguration="DemoApp.Web.ChartsServiceBehavior" name="DemoApp.Web.ChartsService">
            <endpoint address="" binding="basicHttpBinding" bindingConfiguration="ServicesBinding" contract="DemoApp.Web.IChartsService" />
        </service>
    </services>
  

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

Кто-нибудь может помочь мне решить эту проблему?

Ответ №1:

Я изменил httpGetEnabled на httpsGetEnabled в приведенном ниже коде в web.config, и это решило проблему.

 <behaviors>
        <serviceBehaviors>
            <behavior name="DemoApp.Web.ChartsServiceBehavior">
                <serviceMetadata httpsGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="true" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <services>
        <service behaviorConfiguration="DemoApp.Web.ChartsServiceBehavior" name="DemoApp.Web.ChartsService">
            <endpoint address="" binding="basicHttpBinding" bindingConfiguration="ServicesBinding" contract="DemoApp.Web.IChartsService" />
        </service>
    </services>
  

Комментарии:

1. Я хотел бы подчеркнуть, что до того, как оно было httpGetEnabled, а правильным является httpsGetEnabled . Пожалуйста, обратите внимание на букву «s»

Ответ №2:

Приведенный выше ответ — это одно решение, а здесь — другое.

Попробуйте это:

 <serviceBehaviors>
    <behavior name="VATScan.Web.ChartsServiceBehavior">
        <serviceMetadata httpGetEnabled="true" httpGetUrl="[your service address]" />
        <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
</serviceBehaviors>
  

Замените [ваш сервисный адрес] на что-то вроде «http://localhost:8080/ChartsServiceBehavior «

Помогло ли это?

Проверьте это: https://social.msdn.microsoft.com/Forums/vstudio/en-US/2fd858cb-8988-444f-868c-2ceea9cc9705/httpgetenabled-property?forum=wcf

Комментарии:

1. Большое спасибо за ваш ответ 🙂

Ответ №3:

Сегодня я столкнулся с этой проблемой, но ни одно из вышеперечисленных решений не сработало для меня. Я решил эту проблему, выполнив следующие действия.

Проверьте, какой тип «ServiceHost» вы пытаетесь открыть. Например:

 ..
myServiceHost = new ServiceHost(typeof(CMDataCollector.CMDataService));
myServiceHost.Open();      //this line was giving the above exception
..
  

Типом «ServiceHost» должно быть имя службы в вашей конфигурации, как показано ниже.

       <service name="CMDataCollector.CMDataService">
        <endpoint address="rest" binding="webHttpBinding" contract="CMDataCollector.IRealtimeDataService" behaviorConfiguration="jsonBehavior" />
        <endpoint address="" binding="basicHttpBinding" contract="CMDataCollector.IRealtimeDataService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:9080/TRealtimeData/" />
          </baseAddresses>
        </host>
      </service>
  

Тип «ServiceHost» и имя службы в конфигурации должны быть одинаковыми. Затем вы можете открыть «ServiceHost» и запустить службу

Ответ №4:

 Either supply an HTTP base address or set HttpsGetUrl to an absolute address.
  

Эта ошибка произошла из-за того, что параметр логически неверен. Если вы включаете средство httpGetEnabled, вы разрешаете клиентам извлекать метаданные через HTTP (это означает, что клиенты могут получать информацию об этих методах, предоставляемых службами). И если вы не укажете URL-адрес для HTTP, как клиенты могут извлекать метаданные из HTTP. Таким образом, сообщение об ошибке предупреждает вас о необходимости указать URL-адрес.

У вас есть три варианта.

  1. Укажите httpGetUrl, как показано в другом ответе выше
  2. Привязка адреса через IIS

Привязки
введите описание изображения здесь

  1. Установите для httpGetEnabled значение false или какой-либо ответ измените httpGetEnabled на httpsGetEnabled означает, что в их IIS установлены только привязки HTTPS