ASMX WebサービスからコンシューマWebページにHTTPResponseを返す方法
-
08-07-2019 - |
質問
私は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)
またはコンテンツがテキストの場合-文字列を返します。