WCF RESTO Starter Kit - Uma propriedade com o nome 'UriTemplateMatchResults' já existe

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

  •  22-08-2019
  •  | 
  •  

Pergunta

Eu só comecei com o Starter Kit WCF REST.

Eu criei um serviço simples que retornar uma matriz de um objeto.

Usando o navegador, tudo funciona bem, mas quando eu uso um cliente WCF, recebo uma ArgumentException.

Eu não estou usando o IIS e aqui está o código:

O contrato:

[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; }
    }

Para iniciar o serviço:

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

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

Para iniciar o cliente:

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);
            }

O servidor eo cliente estão na mesma solução e estou usando a mesma interface em ambos (para descrever o contrato de serviços).

A exceção diz: "Uma propriedade com o nome 'UriTemplateMatchResults' já existe." e que é o rastreamento de pilha:

Class disparar a exceção -> Microsoft.ServiceModel.Web.WrappedOperationSelector

Rastreamento de pilha:

  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)

O que estou fazendo de errado?

UPDATE: eu desativei a página de ajuda eo serviço está funcionando agora. É um bug?

host.EnableAutomaticHelpPage = false;

Obrigado!

André Carlucci

Foi útil?

Solução

tive o mesmo problema, desativado a página de ajuda e fixa-lo. A exceção estava sendo lançada se alguns URLs restantes foram chamados em uma sequência muito rapidamente. Ele estava bem quando espera entre as chamadas.

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

Outras dicas

Eu tive o mesmo probem, mas eu queria ver a página de ajuda tão incapacitante que não era uma solução para mim. Eu descobri que URITemplating no WCF RESTO Toolkit está causando os problemas, quando vê que já têm esse modelo nas tabelas de modelo. Basicamente, você só precisa de um modelo quando o URL para o seu método é diferente de acordo com os dados solicitados, afinal de contas, é isso que os modelos são para. Eu tinha os mesmos URITemplates para minhas operações POST, de modo que os URLs não diferiu entre consultas separadas que faz com que este erro. então eu descobri que eu realmente não precisa de qualquer modelagem de todo, pelo menos para as operações de pós, além disso youvannot fazer uma consulta POST embora o URL se o seu método requer um objeto complexo para ser passado como um parâmetro. Então eu removi o UriTemplate chamado parâmetro do atributo WebInvoke na interface do serviço, acho que resolveu o problema. Claro, se você fazer consultas chegar ao servidor e contar com URITemplating você ainda vai ter que quer colocar-se com ou deixar fora a página de ajuda.

No meu caso, o problema só ocorreu ao acessar o endpoint usando um canal WCF com a integração depurador Visual Studio habilitado.

Eu trabalhei em torno do problema adicionando algum código para remover o comportamento VS do ChannelFactory:

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

Aparentemente, há outras maneiras de desativar WCF Visual Studio integração depurador, mas eles parecem estar em todo o sistema, enquanto esta solução é local.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top