Frage

Sagen wir, ich habe eine ASMX Web-Service, MyService. Der Dienst hat ein Verfahren, MyMethod. Ich konnte MyMethod auf der Server-Seite auszuführen, wie folgt:

MyService service = new MyService();
service.MyMethod();

Ich brauche ähnlich zu tun, mit Service und Verfahren erst zur Laufzeit bekannt.

ich diese Reflexion gehe davon ist die Art und Weise, darüber zu gehen. Leider habe ich eine harte Zeit, es arbeiten zu machen. Wenn ich diesen Code ausführen:

Type.GetType("MyService", true);

Es wirft diesen Fehler:

  

Typen kann nicht 'MyService' aus Assembly laden 'App_Web__ktsp_r0, Version = 0.0.0.0, Culture = neutral, PublicKeyToken = null'.

Jede mögliche Anleitung geschätzt.

War es hilfreich?

Lösung

Ich bin mir nicht sicher, ob dies der beste Weg, um darüber zu gehen wäre. Der naheliegendste Weg zu mir, wäre eine HTTP-Anforderung zu machen, und rufen Sie den Webservice ein tatsächlichen HTTP GET oder POST. Verwenden Sie Ihre Methode, ich bin nicht ganz sicher, wie Sie die Daten einrichten würden Sie auf den Web-Service senden. Ich habe einige Beispiel-Code in VB.Net hinzugefügt

Dim HTTPRequest As HttpWebRequest
Dim HTTPResponse As HttpWebResponse
Dim ResponseReader As StreamReader
Dim URL AS String
Dim ResponseText As String

URL = "http://www.example.com/MyWebSerivce/MyMethod?arg1=A&arg2=B"

HTTPRequest = HttpWebRequest.Create(URL)
HTTPRequest.Method = "GET"

HTTPResponse = HTTPRequest.GetResponse()

ResponseReader = New StreamReader(HTTPResponse.GetResponseStream())
ResponseText = ResponseReader.ReadToEnd()

Andere Tipps

// Versuchen Sie, diese ->

    Type t = System.Web.Compilation.BuildManager.GetType("MyServiceClass", true);
    object act = Activator.CreateInstance(t);                
    object o = t.GetMethod("hello").Invoke(act, null);

Obwohl ich weiß nicht, warum Reflexion ist für Sie da nicht funktioniert (ich nehme an dem Compiler könnte eine neue Klasse von Ihren [WebService] Anmerkungen erschaffen), hier einige Ratschläge, die Ihr Problem lösen könnten:

Halten Sie Ihre WebService einfache, flache, kurz:. Eine Implementierung der Fassade Muster

Machen Sie Ihre Service delegieren Berechnung auf eine Implementierung der Klasse, die leicht aufrufbar durch Reflexion sein sollte. Auf diese Weise Ihre WebService-Klasse ist nur eine Front für Ihr System - Sie können sogar einen E-Mail-Handler, XML-RPC-Frontend usw. hinzuzufügen, da Ihre Logik ist mit dem WebService nicht gekoppelt, sondern zu einem tatsächlichen Business-Schicht-Objekt

Denken Sie an WebService-Klassen als UI-Ebene Objekte in der Architektur.

Hier ist eine schnelle Antwort jemand wahrscheinlich erweitern auf kann.

Wenn Sie das WSDL-Templating-App (WSDL.exe) verwenden Service-Wrapper genereate, baut es eine Klasse von Typ Soaphttpclientprotocol. Sie können es manuell tun, auch:

public class MyService : SoapHttpClientProtocol
{
    public MyService(string url)
    {
        this.Url = url;
        // plus set credentials, etc.
    }

    [SoapDocumentMethod("{service url}", RequestNamespace="{namespace}", ResponseNamespace="{namespace}", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
    public int MyMethod(string arg1)
    {
        object[] results = this.Invoke("MyMethod", new object[] { arg1 });
        return ((int)(results[0]));
    }
}

ich diesen Code nicht getestet, aber ich denke, es sollte funktionieren Stand-alone ohne das WSDL-Tool ausführen zu müssen.

Der Code, den ich zur Verfügung gestellt habe der Anrufer-Code ist, der über einen Remote-Aufruf an den Web-Service bis Haken (auch wenn aus irgendeinem Grund, Sie wollen es nicht wirklich remote sein.) Die Invoke-Methode übernimmt Verpackungs es als Soap Anruf. @ Dave Wird Code ist richtig, wenn Sie den Web-Service-Aufruf über HTTP umgehen wollen - solange Sie tatsächlich in der Lage sind, die Klasse zu verweisen. Vielleicht ist der interne Typ nicht „MyService.“ - Sie den Code der Kontrolle überprüfen müssten sicher zu wissen,

@Kibbee: Ich brauche die HTTP-Performance-Einbußen zu vermeiden. Es wird kein Remote-Aufruf sein, so dass alle, dass Overhead hinzugefügt sollte unnötig.

@Daren: ich auf jeden Fall mit dieser Design-Philosophie zustimmen. Das Problem hier ist, dass ich sein werde nicht in der Kontrolle des Dienstes oder die zugrunde liegenden Geschäftslogik.

Dies ist für einem Serversteuer , die gegen einen beliebigen Dienst / Methode auszuführen müssen, orthogonal, wie der Web-Dienst selbst durchgeführt wird.

Obwohl ich kann nicht von Ihrem Beitrag sagen:

Eine Sache im Auge zu behalten ist, dass, wenn Sie Reflektion verwenden, müssen Sie eine Instanz der automatisch generierten WebService-Klasse (die eine von Ihrem Webservice WSDL erstellt). Sie nicht die Klasse, die für die Server-Seite des Dienstes responsbile ist.

Also, wenn Sie eine Webservice

    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [ToolboxItem(false)]
    public class WebService1 : System.Web.Services.WebService
    {
     ...
    }

Sie können nicht, dass die Montage in Ihrem Client verweisen und so etwas wie:

WebService1  ws = new WebService1 ();
ws.SomeMethod();

@Radu: Ich bin in der Lage, eine Instanz und rufen Sie die Methode genau so zu erstellen. Zum Beispiel, wenn ich diese ASMX:

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

Ich bin in der Lage es von einer ASPX-Seite Code-Behind so nennen:

MyService service = new MyService();
Response.Write(service.HelloWorld());

Wollen Sie damit sagen, dass nicht funktionieren sollte?

Ich schaute auf diese Frage zurück, und ich denke, was Sie konfrontiert ist, dass der Code ASMX wird in eine DLL mit einem zufälligen Namen als Teil der dynamischen Erstellung Ihrer Website eingebaut werden. Ihr Code, um den Typ nachschlagen wird, standardmäßig nur seine eigene Einheit (eine andere App_Code DLL, von den Blicken der Fehler, den Sie erhalten haben) suchen und Kernbibliotheken. Sie könnten einen speziellen Montag Referenz „Type-Namen, Assembly“ bieten zu GetType (), aber das ist nicht möglich, bei dem automatisch erzeugten Baugruppen, die nach jedem recompile neuen Namen haben.

Lösung .... Ich habe das nicht selbst vor getan, aber ich glaube, dass Sie in der Lage sein sollten wie folgt zu verwenden:

System.Web.Compilation.BuildManager.GetType("MyService", true)

als die Buildmanager kennt die DLLs es geschaffen hat und weiß, wo suchen.

Ich denke, das ist wirklich nicht mit Web Services zu tun haben, aber wenn es Ihren eigenen Code waren, Daren recht Fassadenmuster.

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