0

wsdl.exeツールを使用してSOAPクラスを生成しました。残念ながら、特定のURLにバインドされているようで、インスタンスごとに変更できる必要があります(同じインターフェイスを共有する複数のURLに接続できるようにしたい)。だから、私はそのようなコードを変更したいと思います:

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Web.Services.WebServiceBindingAttribute(Name="Service1Soap", Namespace="http://productmarket.bigbrain.math.uni.lodz.pl/")]
public partial class Service1 : System.Web.Services.Protocols.SoapHttpClientProtocol {

// some code here

    /// <remarks/>
    [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://productmarket.bigbrain.math.uni.lodz.pl/Authenticate", RequestNamespace="http://productmarket.bigbrain.math.uni.lodz.pl/", ResponseNamespace="http://productmarket.bigbrain.math.uni.lodz.pl/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
    public bool Authenticate(int ContractorId, string Password) {
        object[] results = this.Invoke("Authenticate", new object[] {
                    ContractorId,
                    Password});
        return ((bool)(results[0]));
    }

// more code here

}

Authenticateの属性(HTTP URLを持つ属性)が可変になるようにします。私がこれまでに見つけた唯一の解決策は、Service1クラス内に静的な文字列を作成し、次のようにAuthenticateコードを変更することです。

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Web.Services.WebServiceBindingAttribute(Name="Service1Soap", Namespace="http://productmarket.bigbrain.math.uni.lodz.pl/")]
public partial class Service1 : System.Web.Services.Protocols.SoapHttpClientProtocol {


//some code

    public static string prefix = "http://productmarket.bigbrain.math.uni.lodz.pl/";
    public static string soap_namespace = "http://productmarket.bigbrain.math.uni.lodz.pl/";


    /// <remarks/>
    [System.Web.Services.Protocols.SoapDocumentMethodAttribute(Service1.prefix+"Authenticate", RequestNamespace=Service1.soap_namespace, ResponseNamespace=Service1.soap_namespace, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
    public bool Authenticate(int ContractorId, string Password) {
        object[] results = this.Invoke("Authenticate", new object[] {
                    ContractorId,
                    Password});
        return ((bool)(results[0]));
    }

//some code

}

リクエストごとにインスタンスを変更するのではなく、インスタンスからこの情報を取得するより良いソリューションはありますか?私はC#の属性の概念を正確に理解していないことを認めなければなりません。

4

1 に答える 1

1

名前空間属性はサービス エンドポイントではありません。目的は、名前空間を正確に定義すること、または SOAP呼び出しで使用されるエンティティ/メソッドのxml 名前空間を改善することです。

サーバー部分の url エンドポイントは、サービスが公開される場所で暗黙的に定義されます。

クライアント部分では、特定の実装に依存します。

私が覚えている wsdl.exe クライアントの場合、構文は次のようなものです。

Service1 ws = new Service1();
ws.Url = "http://anyserver.addr/of/the/service.asmx";

bool auth = ws.Authenticate(21,"****");
于 2013-01-25T14:03:29.620 に答える