Продолжайте получать ошибку WCF, несмотря на внесение изменений в веб-конфигурацию и фабрику хоста. - PullRequest
0 голосов
/ 19 ноября 2011

На моем компьютере разработчика моя служба 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 или с именем хоста? Это поставило меня в тупик.

Ответы [ 2 ]

2 голосов
/ 20 июля 2012

Если вы работаете на localhost и используете framework 4.0, используйте только одну конечную точку, установив следующее:

<serviceHostingEnvironment multipleSiteBindingsEnabled="False" />

Используйте это, и оно запустится.

1 голос
/ 20 ноября 2011

Я нашел решение, хотя пока неадекватное. Если вы используете .NET 4 и гарантированно запустите его, добавьте следующую конфигурацию:

<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />

Это должно устранить ошибку. Если вы не используете .NET 4, вы должны создать фабрику, как я, но вы должны создать сервисный хост и указать адрес в списке. Адрес, который вы выбираете, не тривиален. Неправильный адрес может быть нежелательным URL или, что еще хуже, неправильной схемой, что приводит к другим ошибкам обслуживания. В идеале вы должны создать свой URL из HttpContext и желаемой схемы.

Вот урезанная версия:

public class MyServiceHostFactory : System.ServiceModel.Activation.ServiceHostFactory
{
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {                        
        ServiceHost host;

        // This solution is less than ideal because the Uri at baseAddresses[0] could be the wrong Url or
        // the  wrong scheme. 
        host = new ServiceHost(serviceType, baseAddresses[0]);

        // A better solution, is to use the incoming request Uri and pass it in like so:
        host = new ServiceHost(serviceType, *** construct the url from Http Context ***);

        return host;
    }
}
...