WCF REST Starter Kit - Una proprietà con 'UriTemplateMatchResults' il nome esiste già

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

  •  22-08-2019
  •  | 
  •  

Domanda

Ho appena iniziato con la Starter Kit WCF REST.

ho creato un semplice servizio che restituiscono una matrice di un oggetto.

Con il browser, tutto funziona bene, ma quando uso un client WCF, ottengo un ArgumentException.

Non sto usando IIS e qui è il codice:

Il contratto:

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

Per avviare il servizio:

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

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

Per avviare il client:

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

Il server e il client sono nella stessa soluzione e sto utilizzando la stessa interfaccia sia (per descrivere il contratto di servizio).

L'eccezione dice: "Una proprietà con il nome esiste già 'UriTemplateMatchResults'." e questa è la traccia dello stack:

Class sparare l'eccezione -> Microsoft.ServiceModel.Web.WrappedOperationSelector

Analisi dello stack:

  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)

Che cosa sto facendo di sbagliato?

UPDATE: ho disabilitato la pagina di aiuto e il servizio è ora di lavoro. Si tratta di un bug?

host.EnableAutomaticHelpPage = false;

Grazie!

André Carlucci

È stato utile?

Soluzione

avuto lo stesso problema, disabilitato la pagina di aiuto e riparato. L'eccezione era stata generata se alcuni URL REST sono stati chiamati in una sequenza molto rapidamente. E 'stato bello quando in attesa tra le chiamate.

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

Altri suggerimenti

Ho avuto la stessa probem, ma volevo vedere la pagina di aiuto in modo invalidante non era una soluzione per me. Ho scoperto che URITemplating nella WCF REST Toolkit sta causando coloro problema, quando si vede che già questo modello nelle tabelle del modello. In sostanza si avrà solo bisogno di un modello quando l'URL al vostro metodo è diverso in base ai dati richiesti, dopo tutto, questo è ciò che i modelli sono per. Ho avuto lo stesso URITemplates per le mie operazioni di POST, quindi gli URL non differiva tra le query separati che causa questo errore. poi ho scoperto che in realtà non ha bisogno di template a tutti, almeno per quanto riguarda le operazioni di POST, inoltre youvannot fare una query POST se l'URL se il metodo richiede un oggetto complesso per essere passato come parametro. Così ho rimosso il nome del parametro UriTemplate dall'attributo WebInvoke nell'interfaccia di servizio, penso che ha risolto il problema. Naturalmente se si fanno GET query al server e si basano su URITemplating avrai ancora a uno mettere in su con o lasciare via la pagina di aiuto.

Nel mio caso, il problema si è verificato solo quando si accede al computer utilizzando un canale WCF con Visual Studio debugger integrazione attivata.

Ho lavorato tutto il problema con l'aggiunta di un po 'di codice per rimuovere il comportamento VS dalla ChannelFactory:

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

A quanto pare, ci sono altri modi per disattivare WCF Visual Studio integrazione debugger, ma sembrano essere a livello di sistema, mentre questa soluzione è locale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top