7

ASMX Web サービス MyService があるとします。このサービスには、MyMethod というメソッドがあります。次のように、サーバー側で MyMethod を実行できます。

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

実行時までわからないサービスとメソッドを使用して、同様のことを行う必要があります。

私は反省がそれについて行く方法であると仮定しています。残念ながら、私はそれを機能させるのに苦労しています。このコードを実行すると:

Type.GetType("MyService", true);

次のエラーがスローされます。

アセンブリ 'App_Web__ktsp_r0、バージョン = 0.0.0.0、カルチャ = ニュートラル、PublicKeyToken = null' から型 'MyService' を読み込めませんでした。

任意のガイダンスをいただければ幸いです。

4

8 に答える 8

2

// これを試してください ->

    Type t = System.Web.Compilation.BuildManager.GetType("MyServiceClass", true);
    object act = Activator.CreateInstance(t);                
    object o = t.GetMethod("hello").Invoke(act, null);
于 2009-04-08T14:02:13.550 に答える
2

これが最善の方法であるかどうかはわかりません。私にとって最も明白な方法は、HTTP リクエストを作成し、実際の HTTP GET または POST を使用して Web サービスを呼び出すことです。あなたの方法を使用すると、Web サービスに送信するデータをどのように設定するのか完全にはわかりません。VB.Net にいくつかのサンプル コードを追加しました。

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()
于 2008-09-15T12:35:20.230 に答える
1

リフレクションがそこで機能しない理由はわかりませんが (コンパイラーが[WebService]注釈から新しいクラスを作成している可能性があると思います)、問題を解決するためのアドバイスをいくつか示します。

WebService をシンプルに、浅く保ちます。つまり、Facade パターンの実装です

リフレクションを介して簡単に呼び出せるはずの実装クラスに、サービス デリゲート計算を作成します。このように、WebService クラスはシステムのフロントにすぎません。ロジックは WebService ではなく、実際のビジネス レイヤー オブジェクトに結合されているため、電子メール ハンドラー、XML-RPC フロントエンドなどを追加することもできます。

WebService クラスは、アーキテクチャ内の UI レイヤー オブジェクトと考えてください。

于 2008-09-15T12:46:12.870 に答える
1

これは、誰かがおそらく拡張できる簡単な答えです。

WSDL テンプレート アプリ (WSDL.exe) を使用してサービス ラッパーを生成すると、SoapHttpClientProtocol 型のクラスが構築されます。手動でも実行できます。

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

このコードはテストしていませんが、WSDL ツールを実行しなくてもスタンドアロンで動作するはずです。

私が提供したコードは、リモート呼び出しを介して Web サービスに接続する呼び出し元コードです (何らかの理由で実際にリモートにしたくない場合でも)。 Invoke メソッドは、それをソープコール。実際にクラスを参照できる限り、HTTP経由でWebサービス呼び出しをバイパスしたい場合、@ Dave Wardのコードは正しいです。おそらく、内部型は「MyService」ではありません。確実に知るには、コントロールのコードを調べる必要があります。

于 2008-09-15T13:20:27.703 に答える
0

@Radu:インスタンスを作成し、そのようにメソッドを呼び出すことができます。たとえば、このASMXがある場合:

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
パブリッククラスMyService:System.Web.Services.WebService
{{
  [WebMethod]
  パブリック文字列HelloWorld()
  {{
    「HelloWorld」を返します。
  }
}

次のように、ASPXページのコードビハインドから呼び出すことができます。

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

あなたはそれがうまくいかないはずだと言っていますか?

于 2008-09-15T13:18:00.877 に答える
0

@Kibbee: HTTP のパフォーマンス ヒットを回避する必要があります。これはリモート呼び出しではないため、追加のオーバーヘッドはすべて不要なはずです。

@Daren: そのデザイン哲学には間違いなく同意します。ここでの問題は、サービスまたはその基礎となるビジネス ロジックを制御できないことです。

これは、Web サービス自体の実装方法とは直交して、任意のサービス/メソッドに対して実行する必要があるサーバー コントロール用です。

于 2008-09-15T12:59:24.413 に答える
0

この質問を振り返りましたが、あなたが直面しているのは、サイトの動的コンパイルの一部として、ASMX コードがランダムな名前の DLL に組み込まれるということだと思います。型を検索するコードは、既定では、独自のアセンブリ (受け取ったエラーの外観による別の App_Code DLL) とコア ライブラリのみを検索します。特定のアセンブリ参照 "TypeName, AssemblyName" を GetType() に提供できますが、再コンパイルのたびに新しい名前を持つ自動生成アセンブリの場合は不可能です。

解決策....私はこれを自分で行ったことはありませんが、次のようなものを使用できるはずだと思います:

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

BuildManager は作成した DLL を認識しており、どこを見ればよいかを知っているためです。

これは実際には Web サービスとは関係ないと思いますが、それがあなた自身のコードであれば、Facade パターンに関する Daren の権利です。

于 2008-09-17T21:02:26.123 に答える
0

あなたの投稿からはわかりませんが:

リフレクションを使用する場合、自動生成された Web サービス クラス (Web サービスの WSDL から作成されたもの) のインスタンスを作成する必要があることに注意してください。サービスのサーバー側を担当するクラスを作成しないでください。

したがって、Webサービスがある場合

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

クライアントでそのアセンブリを参照して、次のようなことを行うことはできません。

WebService1  ws = new WebService1 ();
ws.SomeMethod();
于 2008-09-15T13:09:29.460 に答える