質問

バイト配列を呼び出し元に返すwebmethodが動作していました:

public byte[] DownloadPDF(string URI)

別の出力(文字列)を返すには、これを変更する必要がありました。そこで、voidを返し、次のような3つのパラメーターを使用して、メソッドを完全に変更することにしました。

public void DownloadFile(string URI, out byte[] docContents, out string returnFiletype)

私のWebサービスは正しくコンパイルされますが、2番目のパラメーター(つまりバイト配列)に問題があると思われます。これは、<!> quot; Add Web Reference <!> quot;プロキシクラスを構築します。このメソッドには3つのパラメータではなく2つのパラメータしかありません:

[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/DownloadFile", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
    [return: System.Xml.Serialization.XmlElementAttribute("docContents", DataType="base64Binary")]
    public byte[] DownloadFile(string URI, out string returnFiletype) {
        object[] results = this.Invoke("DownloadFile", new object[] {
                    URI});
        returnFiletype = ((string)(results[1]));
        return ((byte[])(results[0]));
    }

2番目のパラメーターであるバイト配列が無視される理由はわかりませんが、それが問題の原因であるようです。

もちろん、これはコンパイル時にエラーメッセージが表示されるWebクライアントアプリに混乱します。

No overload for method 'DownloadFile' takes '3' arguments

ここに、3つの引数を渡す必要があるWebクライアントのコードを示します。

myBrokerASMXProxy.ASMXProxy.FileService client = new myASMXProxy.ASMXProxy.FileService();

        byte[] fileDataBytes;
        string fileType;
        client.DownloadFile(URI, fileDataBytes, fileType);

バイト配列を返すように変更して、単一の<!> quot; out <!> quot;を追加することを考えています。パラメータですが、このことと、一般的に、複数の出力要件を処理するためのベストプラクティスについて専門家に尋ねるべきだと思いました。

役に立ちましたか?

解決

この署名を入れないのはなぜですか:

public bool DownloadFile(string URI, out byte[] docContents, out string returnFiletype)

何が起こるかを見るには? Jon Skeetには同意しますが、操作の結果でブールを返すことができます

他のヒント

バイト配列は無視されません-代わりに戻り値の型として配置されます。なぜそれをしているのかはわかりませんが、私の見解ではより理にかなっています。 voidメソッドでoutパラメーターを使用しません。プロキシジェネレーターはoutパラメーターを使用して任意のメソッドを取得し、最初のメソッドを戻り値型に変換するだけだと思われます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top