Frage

ich eine Klasse in einem C # ASP.NET-Projekt bin mit einem Skript in einem zufälligen Skriptsprache geschrieben erlauben WebService Methoden dynamisch zu belichten - in anderen Worten, sollte das Skript in der Lage sein, ein Verfahren nach einem Namen mit jeder Unterschrift zu belichten (solange sie gültig ist, sowieso) nach außen durch diese SOAP-Schnittstelle (in der Lage, sie nach Belieben hinzufügen und entfernen, ohne eine harte Codeänderung zu benötigen), und als solche muß ich in der Lage sein, eine WebService-Klasse in C # zu erstellen während in der Lage, dynamisch Methoden zur Laufzeit hinzufügen und entfernen.

Nun, der beste Plan, den ich in der Lage bin, mit so weit zu kommen ist (Runtime) C # -Code Erzeugen des Webservice darzustellen, System.Reflection.Emit es zu kompilieren und dann die Baugruppe zur Laufzeit geladen - alle, wenn das Skript hinzufügt oder entfernt, ein Verfahren zum / vom Dienst (soll nicht sehr oft, Geist geschehen).

Hat jemand eine bessere Idee, als dies?

War es hilfreich?

Lösung

Sie können WSDL ändern, indem Sie SoapExtensionReflector Klasse. Aus Kirk Evans Blog :

  

Die SoapExtensionReflector wird aufgerufen, wenn Ihre Art reflektiert über wird die WSDL-Definition für Ihren Service zu bieten. Sie können diese Art nutzen, um die Reflexion Anruf abfangen und die WSDL-Ausgabe ändern.

Im folgende Beispiel wird die erste Methode aus 2 Webdiensts Methoden:

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

Erstellen Sie eine Klasse von SoapExtensionReflector geerbt:

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

Fügen Sie diese auf Konfiguration / system.web Abschnitt in web.config:

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

Das sollten Sie einen Ausgangspunkt geben, um dynamisch Methoden aus WSDL-Dokument zu entfernen. Sie müßten auch NotImplementedException von Web-Methode aus, wenn sie deaktiviert ist.

Schließlich müssen Sie Web-Service-Dokumentation durch Aufrufen .asmx Endpunkt ohne? WSDL-Parameter erzeugt deaktivieren. Set href Attribut wsdlHelpGenerator Element zu einem gewissen URL. Sie können DefaultWsdlHelpGenerator.aspx als Ausgangspunkt für eigene Dokumentation Handler verwenden. Siehe Frage auf Web-Service-Dokumentation in XML-Dateien, August 2002 .

Andere Tipps

XMLRPC ist ziemlich tot, nicht wahr?

SOAP impliziert eine WSDL. Wie generieren Sie die WSDL dynamisch?

Sie sollten schauen Sie in WCF verwenden. Ich erwarte, dass Sie in der Lage der Kontrolle über den Prozess zu nehmen von den WSDL-Generierung (und andere Metadaten), aber Sie sollten auch in der Lage sein, die Kontrolle über die Bearbeitung von eingehenden Nachrichten zu übernehmen. Insbesondere können Sie die eingehenden Nachrichten untersuchen, welche Skript auszuführen, welche Parameter zu übergeben, etc.

, um zu bestimmen

Sie können einen WCF-Dienst mit einem Eingang und Ausgang Art von xs:any erstellen und die eingehende Anforderung als Ausgangs Message behandeln. Das würde ermöglicht es Ihnen, jede Art von Daten zu akzeptieren und jede Art von Daten zurückgeben. Sie würden nicht Datenverträge oder statische Typen verwenden, um nur Message in und Message aus.

Das Problem bei diesem Ansatz ist, dass aus der WSDL einen Proxy-Generierung wirklich tut nichts, um die Verbraucher außer bieten einen Wrapper, um die Methode aufzurufen. Bereitstellung von Daten, die mit dem Verfahren akzeptabel wäre selbstgedrehte Datentypen erfordern, usw., die schwer, nicht das ist, es ist einfach nicht so intuitiv wie ein harter, typisierte Vertrag.

muss es eine SOAP-Schnittstelle sein? Das klingt wie es auf einer Strecke / REST / etc basierte API besser geeignet sein könnten. Sie könnten etwas in ASP.NET MVC (mit einer benutzerdefinierten IController.Execute Methode, die die Wirkung der Methode löst) tun ziemlich leicht (in der Tat, ich arbeite an etwas sehr ähnlich zur Zeit einige meiner eigenen Code ).

Zum Beispiel könnten Sie Routen haben:

http://myserver/myservice/mymethod

, die akzeptiert (entweder im Körper oder args) die Nutzlast (Parameter), und gibt das Ergebnis in der Antwort. In nicht-MVC sollten Sie in der Lage sein, etwas ähnliches mit einem Platzhalter-mapped generischen Handler zu tun.

Hier ist ein Vorschlag:

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