質問

私はASMX Webサービスに取り組んでいます。サーバーからドキュメントをダウンロードし、ブラウザーにドキュメントを表示するメソッドを作成しようとしています(呼び出し側の.aspx Webページ)。サービスはエラーなしでビルドされますが、「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を送り返す方法について混乱しているようです。誰かがこれを行う方法のヒントを教えてもらえますか?ありがとう。

役に立ちましたか?

解決

Webハンドラー(.ashx)を調べる必要があります。彼らはあなたが達成しようとしているものに最適です。

例:

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

更新: ashxハンドラーは、実際にはaspxの代替です。基本的に、UIはありませんが、aspxページと同様にget / post要求を処理します。要点は、単純なコンテンツ(ファイルなど)を返すか、簡単なアクションを実行するだけでよい場合に、通常のaspxページを実行することによって生成されるオーバーヘッドを削減することです。

IRequiresSessionStateインターフェイスを使用すると、サイトの他のページと同様にSESSIONオブジェクトを使用できます。必要ない場合は、そのままにしておきます。

このサイトでは、作成方法に関する興味深いウォークスルーがあります。おそらく気にしないので、ステップ4は無視してください。

ドキュメントへのリンクを含む通常のページ(aspx)があると仮定すると:aspxファイル内のリンクは、実際にはashxハンドラーを直接指します。例:

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

次に、ashxハンドラーのProcessRequestメソッドのコードは、必要な呼び出し(DLLとの対話など)を実行してドキュメントを見つけ、context.Response.BinaryWriteメソッド呼び出しを介してブラウザーにストリームバックします。

他のヒント

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

自分でロールバックしたい場合は、次の記事を検討してください。 http://msdn.microsoft.com/en-us/magazine/cc163879。 aspx

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

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

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

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

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