На моем компьютере разработчика моя служба WCF работает без проблем, но при развертывании ее на общем сервере я получаю следующее сообщение об ошибке при попытке получить доступ к моей службе
https://www.mydomain.com/Admin/myservice/service.svc:
Служба '/admin/myservice/service.svc' не может быть активирована из-за
исключение во время компиляции. Сообщение об исключении: это
Коллекция уже содержит адрес со схемой http. Может быть
не более одного адреса на схему в этой коллекции. Если ваш сервис
будучи размещенным в IIS, вы можете решить проблему, установив
'System.serviceModel / serviceHostingEnvironment / multipleSiteBindingsEnabled'
к истине или с указанием
'System.serviceModel / serviceHostingEnvironment / baseAddressPrefixFilters.
Наименование параметра: пункт .; Эта коллекция уже содержит адрес
со схемой http. В этой схеме может быть не более одного адреса
коллекция. Если ваша служба размещается в IIS, вы можете исправить
проблема с настройкой
'System.serviceModel / serviceHostingEnvironment / multipleSiteBindingsEnabled'
к истине или с указанием
'System.serviceModel / serviceHostingEnvironment / baseAddressPrefixFilters.
Имя параметра: элемент
Вот подходящая конфигурация web.config:
<serviceHostingEnvironment aspNetCompatibilityEnabled="true">
<baseAddressPrefixFilters>
<add prefix="https://www.mydomain.com/"/>
</baseAddressPrefixFilters>
</serviceHostingEnvironment>
Вот мой заводской код хоста:
public class MyServiceServiceHostFactory : ServiceHostFactory
{
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
ServiceHost serviceHost = null;
serviceHost = CreateMyServiceServiceHost(baseAddresses);
return serviceHost;
}
private static ServiceHost CreateMyServiceServiceHost(Uri[] baseAddresses)
{
// initialize service host
ServiceHost serviceHost = new ServiceHost(typeof(OrderServices), baseAddresses);
// create and add service endpoint binding using message and user name
WSHttpContextBinding wsHttpContextEndpointBinding = new WSHttpContextBinding(SecurityMode.TransportWithMessageCredential);
wsHttpContextEndpointBinding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
wsHttpContextEndpointBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
wsHttpContextEndpointBinding.AllowCookies = true;
// add meta data service
ServiceMetadataBehavior metadataBehavior = new ServiceMetadataBehavior();
metadataBehavior.HttpGetEnabled = false;
metadataBehavior.HttpsGetEnabled = true;
metadataBehavior.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
ServiceAuthorizationBehavior serviceAuthorizationBehavior =
serviceHost.Description.Behaviors.Find<ServiceAuthorizationBehavior>();
serviceAuthorizationBehavior.PrincipalPermissionMode = PrincipalPermissionMode.UseAspNetRoles;
ServiceDebugBehavior serviceDebugBehavior =
serviceHost.Description.Behaviors.Find<ServiceDebugBehavior>();
serviceDebugBehavior.IncludeExceptionDetailInFaults = true;
ServiceCredentials serviceCredentials = new ServiceCredentials();
serviceCredentials.UserNameAuthentication.UserNamePasswordValidationMode = UserNamePasswordValidationMode.Custom;
serviceCredentials.UserNameAuthentication.CustomUserNamePasswordValidator =
new MyServiceUserNamePasswordValidator((MyServiceMembershipProvider) Membership.Providers["MyServiceMembershipProvider"]);
serviceHost.Description.Behaviors.Add(metadataBehavior);
serviceHost.Description.Behaviors.Add(serviceCredentials);
serviceHost.AddServiceEndpoint(typeof(IOrderServices), wsHttpContextEndpointBinding, "");
// Add MEX endpoint
serviceHost.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpsBinding(), "mex");
return serviceHost;
}
}
Почему я получаю эту ошибку? В каждом техническом документе говорится, что я все делаю правильно в соответствии с документацией. Может ли это быть связано с проблемой SSL или с именем хоста? Это поставило меня в тупик.