سؤال

أنا باستخدام فئة في C# ASP.NET المشروع للسماح برنامج نصي مكتوب في بعض عشوائي لغة البرمجة لفضح أساليب خدمة ويب بشكل حيوي - وبعبارة أخرى ، يجب أن يكون البرنامج النصي قادرة على فضح طريقة أي اسم مع أي توقيع (طالما أنها صالحة ، على أي حال) إلى العالم الخارجي من خلال هذا الصابون واجهة (قادرة على إضافة وإزالة لهم ، دون الحاجة إلى رمز القرص الثابت تغيير) ، وعلى هذا النحو لا تحتاج إلى أن تكون قادرة على إنشاء خدمة ويب فئة في C# في حين يجري قادرة على بشكل حيوي إضافة وإزالة الأساليب في وقت التشغيل.

الآن, أفضل خطة كنت قادرا على المجيء حتى الآن هو (وقت التشغيل) توليد التعليمات البرمجية C# لتمثيل خدمة ويب باستخدام النظام.انعكاس.تنبعث منها تجميع ومن ثم التحميل الجمعية في وقت التشغيل - جميع كلما السيناريو يضيف أو يزيل أسلوب من الخدمة (لا ينبغي أن يحدث في كثير من الأحيان ، العقل).

هل من أحد لديه فكرة أفضل من هذا ؟

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

المحلول

يمكنك تعديل WSDL باستخدام SoapExtensionReflector فئة.من كيرك إيفانز بلوق:

على SoapExtensionReflector يسمى عند نوع ينعكس على تقديم WSDL تعريف الخدمة الخاص بك.يمكنك الاستفادة من هذا النوع لاعتراض انعكاس الاتصال وتعديل WSDL الانتاج.

المثال التالي يزيل الأسلوب الأول من 2 على أساليب خدمة ويب:

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class Service1 : System.Web.Services.WebService
{
   [WebMethod]
   public string HelloWorld()
   {
      return "Hello World";
   }

   [WebMethod]
   public int Multiply(int a, int b)
   {
      return a * b;
   }
}

إنشاء فئة موروثة من SoapExtensionReflector:

namespace TestWebservice
{
   public class MyReflector : SoapExtensionReflector
   {
      public override void ReflectMethod()
      {
         //no-op
      }

      public override void ReflectDescription()
      {
         ServiceDescription description = ReflectionContext.ServiceDescription;
         if (description.PortTypes[0].Operations.Count == 2)
            description.PortTypes[0].Operations.RemoveAt(0);
         if (description.Messages.Count == 4)
         {
            description.Messages.RemoveAt(0);
            description.Messages.RemoveAt(0);
         }
         foreach (Binding binding in description.Bindings)
         {
            if (binding.Operations.Count == 2)
               binding.Operations.RemoveAt(0);
         }
         if (description.Types.Schemas[0].Items.Count == 4)
         {
            description.Types.Schemas[0].Items.RemoveAt(0);
            description.Types.Schemas[0].Items.RemoveAt(0);
         }
      }
   }
}

هذا إضافة إلى التكوين/النظام.ويب قسم في شبكة الإنترنت.التكوين:

<webServices>
   <soapExtensionReflectorTypes>
      <add type="TestWebservice.MyReflector, TestWebservice" />
   </soapExtensionReflectorTypes>
</webServices>

هذا يجب أن تعطيك نقطة انطلاق حيوي إزالة الأساليب من مستند WSDL.سوف تحتاج أيضا إلى رمي NotImplementedException من الويب الأسلوب إذا تم تعطيله.

وأخيرا تحتاج إلى تعطيل خدمة ويب الوثائق التي تنتجها الاحتجاج .asmx نقطة النهاية بدون ؟ WSDL المعلمة.تعيين السمة href من wsdlHelpGenerator عنصر إلى بعض عناوين URL.يمكنك استخدام DefaultWsdlHelpGenerator.aspx كنقطة انطلاق الوثائق الخاصة بك معالج.انظر السؤال على خدمة ويب الوثائق في ملفات XML ، آب / أغسطس 2002.

نصائح أخرى

XMLRPC ميتة إلى حد ما، أليس كذلك؟

الصابون يعني WSDL. كيف يمكنك إنشاء WSDL ديناميكيا؟

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

يمكنك إنشاء خدمة WCF مع نوع الإدخال والمخرجات xs:any والتعامل مع الطلب الوارد باعتباره الخام Message. وبعد من شأنه أن يسمح لك بقبول أي نوع من البيانات وإرجاع أي نوع من البيانات. لن تستخدم عقود البيانات أو الأنواع الثابتة، فقط Message في و Message خارج.

المشكلة في هذا النهج هي أن توليد وكيل من WSDL لا يفعل شيئا حقا لمساعدة المستهلك بخلاف توفير غلاف للاتصال بالطريقة. تتطلب توفير البيانات المقبولة للطريقة أنواع بيانات المتداول يدويا، إلخ والتي ليست صعبة، فهي ليست بديهية مجرد عقد ثابت مكتوب.

هل يجب أن تكون واجهة الصابون؟ يبدو أنه يبدو أنه أكثر ملاءمة في API المستردة / الراحة / وما إلى ذلك. يمكنك أن تفعل شيئا في ASP.NET MVC (مع مخصص IController.Execute الطريقة التي تحل الإجراء إلى الطريقة) بسهولة بسهولة (في الواقع، أنا أعمل على شيء مشابه جدا ل بعض الكود الخاص بي في اللحظة).

على سبيل المثال، قد يكون لديك طرق:

http://myserver/myservice/mymethod

هذا يقبل (إما في الجسم أو Args) الحمولة (المعلمات)، وإرجاع النتيجة في الاستجابة. في NON-MVC، يجب أن تكون قادرا على القيام بشيء مماثل مع معالج عام معين على البدل.

هنا هو اقتراح:

  • استخدام WCF.
  • إنشاء WSDL من WCF باستخدام معلومات في منشور المدونات التالية:

    http://www.pluralsight.com/community/blogs/kirillg/archive/2006/06/18/28380.aspx.

  • يمكنك بعد ذلك نشر هذه المعلومات باستخدام MEX.

  • ثم يتم فتح الخدمات لعملائك لأسفل تحميل بيانات التعريف واستدعاء الخدمات.

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