WCF REST Starter Kit - свойство с именем «UriTemplateMatchResults» уже существует - PullRequest
3 голосов
/ 18 декабря 2008

Я только начал с стартового комплекта WCF REST.

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

С помощью браузера все работает нормально, но когда я использую клиент 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.WrappedOperationSelector

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

  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;

Спасибо!

Андре Карлуччи

Ответы [ 3 ]

1 голос
/ 14 мая 2010

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

1 голос
/ 02 февраля 2009

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

protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
        {
            return new WebServiceHost2(serviceType, true, baseAddresses) {EnableAutomaticHelpPage = false};
        }
0 голосов
/ 21 декабря 2017

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

Я решил эту проблему, добавив код для удаления поведения 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, но они кажутся общесистемными, хотя это решение локально.

...