WCF REST Starter Kit - свойство с именем 'UriTemplateMatchResults' уже существует

StackOverflow https://stackoverflow.com/questions/379162

  •  22-08-2019
  •  | 
  •  

Вопрос

Я только начал с WCF REST Starter Kit.

Я создал простой сервис, который возвращает массив объекта.

При использовании браузера все работает нормально, но когда я использую WCF-клиент, я получаю исключение ArgumentException.

Я не использую IIS, и вот код:

Контракт:

[ServiceContract]
    public interface IGiftService {

        [WebGet(UriTemplate="gifts")]
        [OperationContract]
        List<Gift> GetGifts();

    }

    public class GiftService : IGiftService {

        public List<Gift> GetGifts() {
            return new List<Gift>() {
                new Gift() { Name = "1", Price = 1.0 },
                new Gift() { Name = "2", Price = 1.0 },
                new Gift() { Name = "3", Price = 1.0 }
            };
        }

    }

    [DataContract]
    public class Gift {

        [DataMember]
        public string Name { get; set; }
        [DataMember]        
        public double Price { get; set; }
    }

Чтобы запустить службу:

WebServiceHost2 host = new WebServiceHost2(
                typeof(GiftService), 
                true, 
                new Uri("http://localhost:8099/tserverservice"));
            host.Open();

            Console.WriteLine("Running");
            Console.ReadLine();
            host.Close();

Чтобы запустить клиент:

WebChannelFactory<IGiftService> factory = new WebChannelFactory<IGiftService>(
                new Uri("http://localhost:8099/tserverservice"));

            IGiftService service = factory.CreateChannel();
            List<Gift> list = service.GetGifts();

            Console.WriteLine("-> " + list.Count);
            foreach (var item in list) {
                Console.WriteLine("-> " + item.Name);
            }

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

В исключении говорится:"Свойство с именем "UriTemplateMatchResults" уже существует". и это трассировка стека:

Класс, запускающий исключение -> Microsoft.ServiceModel.Web.Выбор обернутых операций.

Трассировка стека:

  at System.ServiceModel.Channels.MessageProperties.UpdateProperty(String name, Object value, Boolean mustNotExist)
   at System.ServiceModel.Channels.MessageProperties.Add(String name, Object property)
   at System.ServiceModel.Dispatcher.WebHttpDispatchOperationSelector.SelectOperation(Message& message, Boolean& uriMatched)
   at System.ServiceModel.Dispatcher.WebHttpDispatchOperationSelector.SelectOperation(Message& message)
   at Microsoft.ServiceModel.Web.WrappedOperationSelector.SelectOperation(Message& message) in C:\Program Files\WCF REST Starter Kit\Microsoft.ServiceModel.Web\WrappedOperationSelector.cs:line 42
   at Microsoft.VisualStudio.Diagnostics.ServiceModelSink.ServiceMethodResolver.GetOperation()
   at Microsoft.VisualStudio.Diagnostics.ServiceModelSink.ServiceMethodResolver..ctor(ContractDescription contract, DispatchRuntime runtime, Message request, InstanceContext instanceContext)

Что я делаю не так?

Обновить: Я отключил страницу справки, и теперь сервис работает.Это ошибка?

host.EnableAutomaticHelpPage = false;

Спасибо!

André Carlucci

Это было полезно?

Решение

У меня была та же проблема, я отключил страницу справки, и это исправило ее.Исключение создавалось, если некоторые URL-адреса REST вызывались в последовательности очень быстро.Это было прекрасно, когда ждал между звонками.

protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
        {
            return new WebServiceHost2(serviceType, true, baseAddresses) {EnableAutomaticHelpPage = false};
        }

Другие советы

У меня была такая же проблема, но я хотел увидеть страницу справки, поэтому отключить ее не было решением для меня.Я обнаружил, что URITemplating в WCF REST Toolkit вызывает эти проблемы, когда он видит, что у него уже есть этот шаблон в таблицах шаблонов.По сути, шаблон вам понадобится только тогда, когда URL-адрес вашего метода отличается в соответствии с запрошенными данными, в конце концов, именно для этого и предназначены шаблоны.У меня были одинаковые URITemplates для моих операций POST, поэтому URL-адреса не отличались между отдельными запросами, что вызывает эту ошибку.затем я обнаружил, что на самом деле мне вообще не нужны никакие шаблоны, по крайней мере, для операций POST, более того, вы не можете выполнить запрос POST через URL, если ваш метод требует передачи сложного объекта в качестве параметра.Итак, я удалил именованный параметр UriTemplate из атрибута WebInvoke в интерфейсе сервиса, я думаю, что это решило проблему.Конечно, если вы выполняете запросы GET к серверу и полагаетесь на URITemplating, вам все равно придется либо смириться, либо оставить страницу справки.

В моем случае проблема возникала только при доступе к конечной точке с использованием канала WCF с включенной интеграцией Visual Studio debugger.

Я решил проблему, добавив некоторый код для удаления поведения VS из ChannelFactory:

var vsBehaviour = channelFactory.Endpoint.EndpointBehaviors
    .FirstOrDefault(i =>
        i.GetType().Namespace == "Microsoft.VisualStudio.Diagnostics.ServiceModelSink");
if (vsBehaviour != null)
{
    channelFactory.Endpoint.Behaviors.Remove(vsBehaviour);
}

По-видимому, существуют другие способы отключить интеграцию с отладчиком WCF Visual Studio, но они, похоже, являются общесистемными, в то время как это решение локальное.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top