#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-адрес.
У вас есть три варианта.
- Укажите httpGetUrl, как показано в другом ответе выше
- Привязка адреса через IIS
-
Установите для httpGetEnabled значение false или какой-либо ответ измените httpGetEnabled на httpsGetEnabled означает, что в их IIS установлены только привязки HTTPS