Starter Kit WCF REST - eine Eigenschaft mit dem Namen ‚UriTemplateMatchResults‘ existiert bereits

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

  •  22-08-2019
  •  | 
  •  

Frage

ich mit dem WCF REST Starter Kit gerade begonnen.

Ich habe einen einfachen Dienst, der eine Anordnung eines Objekts zurück.

Sie den Browser verwenden, alles funktioniert gut, aber wenn ich einen WCF-Client verwenden, erhalte ich ein Argument.

Ich bin nicht mit IIS und hier ist der Code:

Der Vertrag:

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

Um den Dienst zu starten:

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

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

Um den Client zu starten:

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

Der Server und der Client ist in der gleichen Lösung, und ich bin die gleiche Schnittstelle sowohl mit (dem Servicevertrag beschreiben).

Die Ausnahme, sagt: „Eine Eigenschaft mit dem Namen‚UriTemplateMatchResults‘ist bereits vorhanden.“ und das ist der Stack-Trace:

Klasse feuert die Ausnahme -> Microsoft.ServiceModel.Web.WrappedOperationSelector

Stack-Trace:

  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)

Was mache ich falsch?

UPDATE: ich die Hilfeseite und der Service arbeitet nun deaktiviert. Ist es ein Fehler?

host.EnableAutomaticHelpPage = false;

Danke!

André Carlucci

War es hilfreich?

Lösung

das gleiche Problem hat, die Hilfe-Seite deaktiviert und es regelte es. Die Ausnahme ausgelöst wurde, wenn einige REST-URLs in einer Sequenz sehr schnell genannt wurden. Es war in Ordnung, wenn sie zwischen den Anrufen zu warten.

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

Andere Tipps

Ich hatte das gleiche probem, aber ich wollte die Hilfe-Seite so sehen, zu deaktivieren, es war für mich keine Lösung. Ich fand heraus, dass URITemplating in dem WCF REST Toolkit derjenigediejenigedasjenige Problem verursacht, wenn es sieht, dass es bereits diese Vorlage hat in den Template-Tabellen. Grundsätzlich werden Sie nur eine Vorlage benötigen, wenn die URL Ihrer Methode unterscheidet nach den angeforderten Daten, nachdem alle, das ist, was die Vorlagen sind. Ich hatte die gleichen URITemplates für meine POST-Operationen, so dass die URLs unterschieden sich nicht zwischen den einzelnen Abfragen, die diesen Fehler verursacht. dann fand ich heraus, dass ich eigentlich überhaupt keine Templat brauchte, zumindest für die POST-Operationen, außerdem youvannot eine POST-Abfrage obwohl die URL machen, wenn Ihre Methode ein komplexes Objekt erfordert als Parameter übergeben werden. So entfernte ich die UriTemplate benannten Parameter aus dem WebInvoke Attribute in der Service-Schnittstelle, ich denke, dass das Problem gelöst. Natürlich, wenn Sie Anfragen an den Server GET und verlassen sich auf URITemplating Sie noch mit entweder setzen haben werden oder die Hilfeseite verlassen weg.

In meinem Fall trat das Problem nur dann, wenn der Endpunkt Zugriff aktiviert einen WCF-Kanal mit Visual Studio-Debugger-Integration verwendet wird.

arbeitete ich, um das Problem durch einen Code Hinzufügen des VS Verhalten aus dem Channel zu entfernen:

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

Offensichtlich gibt es andere Möglichkeiten, WCF Visual Studio-Debugger-Integration zu deaktivieren, aber sie scheinen systemweit zu sein, während diese Lösung lokal ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top