Использование WCF без указания URI - PullRequest
1 голос
/ 13 мая 2011

Как использовать WCF без указания адреса uri / url / baseaddress? Есть ли способ заставить его автоматически получать эти вещи?

Я имею в виду, что хочу, чтобы это работало так же, как работают сайты asp.net и веб-сервисы, где мы не упоминаем uri и прочее, и оно заботится об этом само по себе, лишь бы мы настраивали его прямо в IIS. Мне нужно подобное решение на WCF.

Пожалуйста, помогите ...

Спасибо,

Edit: Вот мой код на стороне сервера. Я использую пользовательский ServiceHostFactory здесь ...

 protected override System.ServiceModel.ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {

        BasicHttpBinding basichttpbinding = new BasicHttpBinding(BasicHttpSecurityMode.None);

        basichttpbinding.CloseTimeout=TimeSpan.MaxValue;
        basichttpbinding.OpenTimeout=TimeSpan.MaxValue;
        basichttpbinding.ReceiveTimeout=TimeSpan.MaxValue;
        basichttpbinding.SendTimeout=TimeSpan.MaxValue;
       // basichttpbinding.TransferMode = TransferMode.Buffered;

        ServiceEndpoint servicepoint=new ServiceEndpoint(ContractDescription.GetContract(serviceType));
         servicepoint.Binding=basichttpbinding;

        ServiceHost servicehost = new ServiceHost(serviceType, baseAddresses);

        ((ServiceDebugBehavior)servicehost.Description.Behaviors[typeof(ServiceDebugBehavior)]).IncludeExceptionDetailInFaults=true;

        servicehost.OpenTimeout = TimeSpan.MaxValue;
        servicehost.CloseTimeout = TimeSpan.MaxValue;
        servicepoint.Binding.SendTimeout = TimeSpan.MaxValue;
        servicepoint.Binding.ReceiveTimeout = TimeSpan.MaxValue;
        basichttpbinding.MaxBufferPoolSize = 999999999;
       // basichttpbinding.MaxConnections = 999999999;
        //basichttpbinding.MaxConnections = 999999999;
        basichttpbinding.MaxReceivedMessageSize = 999999999;
        XmlDictionaryReaderQuotas quotas = new XmlDictionaryReaderQuotas();
        quotas.MaxArrayLength = 999999999;
        quotas.MaxBytesPerRead = 999999999;
        quotas.MaxDepth = 999999999;
        quotas.MaxNameTableCharCount = 999999999;
        quotas.MaxStringContentLength = 999999999;
        basichttpbinding.ReaderQuotas = quotas;

        //foreach (Uri uri in baseAddresses)
        //{

        servicehost.AddServiceEndpoint(typeof(IService), basichttpbinding, "http://localhost:52855/WCFService1/Service.svc");

       // }

        return servicehost;
    }

Ответы [ 4 ]

3 голосов
/ 13 мая 2011

(при условии, что вы нацелены на IIS ...)

Согласно Развертывание службы WCF, размещенной на информационных службах Интернета документация:

..Службы, размещенные в IIS, не имеют возможности контролировать свой базовый адрес;базовый адрес службы, размещенной на IIS, - это адрес ее файла .svc.

Возможно ли, что логика узла настраиваемой службы перестала работать?

ОБНОВЛЕНИЕ:Согласно функции docs, вы можете просто передать относительный адрес в вызов AddServiceEndpoint .Попробуйте либо пустую строку, либо "/".

2 голосов
/ 13 мая 2011

Я думаю, все, что вам нужно сделать со своим кодом, это:

servicehost.AddServiceEndpoint(typeof(IService), basichttpbinding, "");

чтобы выполнить то, что вы хотите. Как указал @Schneider, IIS контролирует назначение адреса службы. Адрес конечной точки всегда будет относиться к адресу назначения IIS. Таким образом, единственное допустимое значение для конечной точки на основе IIS будет примерно таким:

servicehost.AddServiceEndpoint(typeof(IService), basichttpbinding, "MyService");

Который добавит MyService к URL службы.

2 голосов
/ 13 мая 2011

Взгляните на WCF Discovery , которая позволяет динамически находить конечные точки.

0 голосов
/ 26 апреля 2012

У меня была похожая проблема - вот что исправило ее для меня:

Добавьте это в начало вашего интерфейса:

[ServiceContract(Namespace = "your namespace here")]

В вашем app.config убедитесь, что вашНазвание сервиса в разделе имеет вид Namespace.Class

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

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