سؤال

محاولاتي القليلة الأولى لإنشاء خدمة مستضافة ذاتيا. محاولة إنشاء شيء ما من شأنه أن يقبل سلسلة استعلام وإعادة بعض النص ولكن لديه بعض المشكلات:

  • جميع محادثات الوثائق حول نقاط النهاية التي يتم إنشاؤها تلقائيًا لكل عنوان أساسي إذا لم يتم العثور عليها في ملف التكوين. لا يبدو أن هذا هو الحال بالنسبة لي ، فأنا أحصل على "الخدمة لها نقاط نهاية تطبيق صفرية ...". يبدو أن تحديد نقطة نهاية قاعدة على النحو التالي يحل هذا:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ServiceModel;
    using System.ServiceModel.Description;
    
    namespace TestService
    {
        [ServiceContract]
        public interface IHelloWorldService
        {
           [OperationContract]
           string SayHello(string name);
        }
    
        public class HelloWorldService : IHelloWorldService
        {
            public string SayHello(string name)
            {
               return string.Format("Hello, {0}", name);
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                string baseaddr = "http://localhost:8080/HelloWorldService/";
                Uri baseAddress = new Uri(baseaddr);
    
                // Create the ServiceHost.
                using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
                {
                    // Enable metadata publishing.
                    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                    smb.HttpGetEnabled = true;
                    smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
                    host.Description.Behaviors.Add(smb);
    
                    host.AddServiceEndpoint(typeof(IHelloWorldService), new BasicHttpBinding(), baseaddr);
                    host.AddServiceEndpoint(typeof(IHelloWorldService), new BasicHttpBinding(), baseaddr + "SayHello");
    
                    //for some reason a default endpoint does not get created here
                    host.Open();
    
                    Console.WriteLine("The service is ready at {0}", baseAddress);
                    Console.WriteLine("Press <Enter> to stop the service.");
                    Console.ReadLine();
    
                    // Close the ServiceHost.
                    host.Close();
                }
             }
         }
    }
    
  • كيف يمكنني إعداد هذا الأمر لإرجاع قيمة الاسم في Sayhello (اسم السلسلة) عند طلب ذلك: LocalHost: 8080/HelloWorldService/Sayhello؟ name = Kyle

أحاول المشي قبل الجري ، لكن هذا يبدو وكأنه الزحف ...

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

المحلول

لسؤالك حول عدم إضافة نقاط النهاية الافتراضية:

  • بادئ ذي بدء ، هذه ميزة WCF 4 - ستعمل على .NET 4 فقط
  • بعد ذلك ، تتم إضافة نقاط النهاية الافتراضية فقط إلى مضيف الخدمة الخاص بك إذا لم يكن لديك نقاط نهاية صريحة محددة في التكوين ، وإذا كنت لا تضيف نقاط النهاية بنفسك في الكود! عن طريق إضافة هاتين النقطتين في الكود ، فأنت تتولى المسؤولية ولن تملأ وقت تشغيل WCF 4 مع التكوين الخاص بك

تحقق من مقالة مكتبة MSDN هذه لمزيد من المعلومات حول ما الجديد في WCF 4 للمطورين. إنه يوضح ، من بين أشياء أخرى ، كيفية استخدام نقاط النهاية الافتراضية - يمكنك تحديد عنوان أساسي لخدمتك وتفتح ServiceHost - هذا كل شيء!

string baseaddr = "http://localhost:8080/HelloWorldService/";
Uri baseAddress = new Uri(baseaddr);

// Create the ServiceHost.
using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
{
   //for some reason a default endpoint does not get created here
   host.Open();

   // here, you should now have one endpoint for each contract and binding
}

يمكنك أيضًا إضافة نقاط النهاية الافتراضية بشكل صريح ، في الكود ، إذا كنت ترغب في القيام بذلك. لذلك إذا كنت بحاجة إلى إضافة نقاط النهاية الخاصة بك ، ولكن بعد ذلك تريد إضافة نقاط النهاية الافتراضية للنظام ، يمكنك استخدام:

// define and add your own endpoints here

// Create the ServiceHost.
using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
{
   // add all the system default endpoints to your host
   host.AddDefaultEndpoints();

   //for some reason a default endpoint does not get created here
   host.Open();

   // here, you should now have your own endpoints, plus 
   // one endpoint for each contract and binding
}

أنا أيضاً fonud هذا المنشور المدونة هنا لكي تكون مضيئة للغاية - مدونة كريستوفر مليئة بمشاركات WCF الجيدة والمفيدة للغاية - الموصى بها للغاية.

نصائح أخرى

أما بالنسبة للكتب - إليك توصيتي: الكتاب الذي أوصي به دائمًا للاستعداد والتشغيل في WCF بسرعة تعلم WCF بقلم ميشيل ليروكس بوستامانتي. إنها تغطي جميع الموضوعات اللازمة ، وبطريقة مفهومة للغاية ودورة. سيعلمك هذا كل شيء - الأساسيات ، والمواضيع المتوسطة ، والأمان ، والتحكم في المعاملات وما إلى ذلك - التي تحتاج إلى معرفتها لكتابة خدمات WCF عالية الجودة والمفيدة.

التعلم wcf http://ecx.images-amazon.com/images/i/41wya٪2Bnipml._bo2،204،203،200_pisitb-sticker-arrow-click،topright،35،-76_aa240_sh20_ou01_.jpg

سيتم تغطية الموضوعات الأكثر تقدماً والمزيد من الانتباه إلى WCF برمجة خدمات WCF بواسطة Juval لوي. إنه يغطس حقًا في جميع التفاصيل الفنية والمواضيع ويعرض "الكتاب المقدس" لبرمجة WCF.

Programming WCF Services

إذا استضافت IIS خدمة الويب الخاصة بك ، فستحصل على صفحة "لقد قمت بإنشاء خدمة ويب" الودية ، على افتراض أنه لا يوجد شيء آخر خاطئ. قد ترغب في تجربة بعض البرامج التعليمية السريعة لـ WCF ، كما يمكن العثور عليها في كتاب WCF التعلم الخاص بـ Bustamente ، فإنهم يذهبون بسرعة ويشرحون الكثير.

تعديل: هذه صفحة MSDN مما يوضح طريقة واحدة للحصول على معلمات سلسلة الاستعلام من مكالمة الخدمة المطلوبة ، مثال رائع. يوضح استخدام سمة [webget]. إذا كنت لا ترغب في استخدام ذلك ، فيمكنك محاولة استخدام OperationContext للوصول إلى الداخلية للطلب الوارد.

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