2

私は ASMX Web サービスに取り組んでいます。サーバーからドキュメントをダウンロードし、ドキュメントをブラウザー (呼び出し元の .aspx Web ページ) に表示するメソッドを作成しようとしています。サービスはエラーなしでビルドされますが、Proxy クラス プロジェクトで「Web 参照を追加」しようとすると、次のエラーが発生します。

System.Web.HttpResponse は、パラメーターなしのコンストラクターがないため、シリアル化できません。

.ASMX ファイルのコードのスニペットを次に示します。

public class FileService : System.Web.Services.WebService
{
    [WebMethod]
    public void DownloadDocument(string URI, HttpResponse httpResponse)
    {
        int DownloadChunkSize = (int)Properties.Settings.Default.DownloadChunkSize;
        // some more code here....
        using (httpResponse.OutputStream)
        {
            // more code here...
        }
    }
}

Web サービスから要求している Web ページに HttpResponse を返す方法について混乱しているようです。誰かがこれを行う方法についてのヒントを教えてください。ありがとう。

4

3 に答える 3

4

You should look into web handlers (.ashx). They are perfect for what you are trying to achieve.

For example:

public class Download : IHttpHandler, IRequiresSessionState {

    public void ProcessRequest(HttpContext context) {
        var pdfBytes = /* load the file here */
        context.Response.ContentType = @"Application/pdf";
        context.Response.BinaryWrite(pdfBytes);
        context.Response.End();
    }
}

UPDATE: An ashx handler is actually a replacement to aspx. Basically, it has no UI but still processes get / post requests just like an aspx page does. The point is to reduce the overhead generated by running a regular aspx page when all you need to do is return some simple content (like a file...) or perform a quick action.

The IRequiresSessionState interface allows you to use the SESSION object like any other page in your site can. If you don't need that, then leave it off.

This site has an interesting walk through on how to create one. Ignore Step 4 as you probably don't care about that.

Assuming that you have a regular page (aspx) that has a link to your document: The link in the aspx file would actually point directly to your ashx handler. for example:

<a href="/document.ashx?id=blah">Click Here</a>

Then the code in the ProcessRequest method of the ashx handler would do whatever calls it needed (like talk to your DLL) to locate the document then stream it back to the browser through the context.Response.BinaryWrite method call.

于 2009-03-10T22:43:21.020 に答える
1

これは、標準のASMXWebサービスが機能する方法ではありません。独自のハンドラーを作成する場合、またはASPXページを使用してドキュメントを配信する場合でも問題ありませんが、これを行う標準のASMX Webサービスの方法は、実際にドキュメントのビットをエンコードされたBLOBとして返すことです。

自分で作成したい場合は、次の記事を検討してください:http: //msdn.microsoft.com/en-us/magazine/cc163879.aspx

于 2009-03-10T21:49:27.433 に答える
0

(asmxからの)web smethodは、シリアル化できるオブジェクトを返します。

次のようなメソッドを作成する必要があります。

[WbeMethod] public byte [] DownloadDocument(string URI)

または、コンテンツがテキストの場合-文字列を返します。

于 2009-03-10T21:54:40.900 に答える