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.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;

شكرًا لك!

أندريه كارلوتشي

هل كانت مفيدة؟

المحلول

واجهت نفس المشكلة، وتم تعطيل صفحة المساعدة وتم إصلاحها.تم طرح الاستثناء إذا تم استدعاء بعض عناوين URL لـ REST في تسلسل بسرعة كبيرة.كان الأمر جيدًا عند الانتظار بين المكالمات.

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

نصائح أخرى

كان لدي نفس المسبار، ولكني أردت رؤية صفحة المساعدة لذا فإن تعطيلها لم يكن حلاً بالنسبة لي.لقد اكتشفت أن URITemplating في مجموعة أدوات WCF REST يسبب هذه المشكلة، عندما يرى أنه يحتوي بالفعل على هذا القالب في جداول القوالب.في الأساس، لن تحتاج إلى قالب إلا عندما يكون عنوان URL لطريقتك مختلفًا وفقًا للبيانات المطلوبة، ففي نهاية المطاف، هذا هو الغرض من القوالب.كان لدي نفس URITemplates لعمليات POST الخاصة بي، لذلك لم تختلف عناوين URL بين الاستعلامات المنفصلة مما يسبب هذا الخطأ.ثم اكتشفت أنني في الواقع لا أحتاج إلى أي قوالب على الإطلاق، على الأقل لعمليات POST، علاوة على ذلك، لا يمكنك إجراء استعلام POST من خلال عنوان URL إذا كانت طريقتك تتطلب تمرير كائن معقد كمعلمة.لذلك قمت بإزالة المعلمة المسماة URITemplate من سمة WebInvoce في واجهة الخدمة، وأعتقد أن ذلك قد حل المشكلة.بالطبع، إذا قمت بإجراء استعلامات GET إلى الخادم واعتمدت على URITemlating، فسيظل يتعين عليك إما قبول صفحة المساعدة أو تركها بعيدًا.

في حالتي، حدثت المشكلة فقط عند الوصول إلى نقطة النهاية باستخدام قناة 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، ولكن يبدو أنها على مستوى النظام، في حين أن هذا الحل محلي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top