2012-01-04 24 views
1

.NET Webサービスは、コード化されたHTML文字列をパラメータとして受け取り、文字列をデコードし、HTMLからPDFを作成します。私は、古典的なaspのWebページからwebserviceへの同期サーバー側の呼び出しを行いたい。プレーンテキスト文字列(htmlタグなし)を使用するとうまくいきますが、エンコードされたhtml文字列を送信すると、webserviceに達すると文字列が空であるように見えます。古典ASPのWebserviceへのサーバーサイドコール

プレーンテキスト文字列とエンコードされたhtml文字列の両方を使用して、クライアント側からwebserviceを呼び出すとうまく動作しています。

私のコードは次のようになります。

Private Sub SaveBookHtmlToPdf(pHtml, pShopId) 
    Set oXMLHTTP = CreateObject("Msxml2.ServerXMLHTTP.6.0")   
    Dim strEnvelope 
    strEnvelope = "pShopId=" & pShopId & "&pEncodedHtml=" & Server.HTMLEncode(pHtml) 
    Call oXMLHTTP.Open("POST", "https://mydomain.dk:4430/PdfWebservice.asmx/SaveBookToPdf", false) 
    Call oXMLHTTP.SetRequestHeader("Content-Type","application/x-www-form-urlencoded") 
    Call oXMLHTTP.Send(strEnvelope) 
    Set oXMLHTTP = Nothing 
End Sub 

それは、サーバー上のセキュリティ問題のいくつかの種類のようなにおいがします。クライアント側から非同期呼び出しをポストするときには動作しますが、サーバ側からは来ません。エンコードされたHTML文字列は、Webサービスへのサーバー側の呼び出しでは何らかの形で許可されていないようです。

このトリッキーな問題を解決する方法を知っている人は誰ですか?

+2

[フィドラー](http://www.fiddler2.com/fiddler2/)を使用して、実際に何を送信しているのか、そしてウェブサービスメッセージは何ですか? – balexandre

+0

Webサービスへの呼び出しはサーバー側で行われるため、残念ながら私はFiddlerを使用できません。私は、Webサービスに送信されたデータを画面に印刷しようとしましたが、それはすべきですが、何らかの形で、エンコードされたHTML文字列のパラメータが空であるように見えます。 –

+0

@ Stuffen:どのバージョンのIISを使用していますか? Fiddlerをインストールできるテストサーバーまたは開発マシンがありますか? – AnthonyWJones

答えて

1

これは私にはすべて間違っになります

Server.HTMLEncode(pHtml) 

彼らは非常に異なっていても、開発者がHTMLエンコーディングとURLエンコーディングの間で混乱するのはかなり一般的で、その。 URLがコード化されたデータを転記しています。したがって、あなたのコードではなくURLEncodeを使用する必要があります。

strEnvelope = "pShopId=" & pShopId & "&pEncodedHtml=" & Server.URLEncode(pHtml) 

編集

URLEncodeはそれがURLエンコードポストと互換性がない可能性があり、それは20%」「+」に代わりの空間を変換されないことを一つのこと"したがって、より堅牢なアプローチがあるかもしれない:

strEnvelope = "pShopId=" & pShopId & "&pEncodedHtml=" & Replace(Server.URLEncode(pHtml), "+", "%20") 

もう一つの問題をResponse.CodePageの現在値がURLEncodeが非ASCII文字をエンコードする方法に影響を与えるということであるに注意します。通常、.NETはデフォルトでUTF-8で動作します。したがって、あなたはまた、あなたのResponse.CodePageが65001

Response.CodePage = 65001 
strEnvelope = "pShopId=" & pShopId & "&pEncodedHtml=" & Replace(Server.URLEncode(pHtml), "+", "%20") 
+0

私はそれを投稿する前に文字列をHtmlEncodingし、Webサービスで受け取ったときに再びHtmlDecodingします。それがどのように問題になるのか分からないのですか?代わりにUrlEncodingを試しましたが、それでも動作しません。 –

+0

@SteffenJørgensen:HTMLEncodingの目的は、HTMLパーサーに意味のある文字を含むことがあるテキストコンテンツを<<<および&gt; &にエスケープできるようにすることです。しかし、HTMLパーサーでコンテンツを解析しようとしていないサーバーにポストしているので、HTMLEncodeは役に立ちません。 OTHでは、__URLEncoding__(設定しているContent_Typeヘッダーの値に注意してください)と一貫した方法でエスケープする必要のあるスペース、=、&などの文字を含む可能性があるテキストコンテンツを投稿しています。 URLエスケープシーケンスの形式は%xxです。したがって、 'URLEncode'が必要です。 – AnthonyWJones

+0

HTMLEncodeの代わりにURLEncodeを使用することで、ついにそれを使い果たしました。メディを助けてくれた皆様に感謝します。 –

0

これはよく、または助けないかもしれないに設定されていることを確認したくなるでしょうが、私は手動でそれをやって持っていたいくつかの問題を解決する便利なSOAP Class for Classic ASPを使用しています。あなたのコードは次のようになります。

Set cSOAP = new SOAP 
cSOAP.SOAP_StartRequest "https://mydomain.dk:4430/PdfWebservice.asmx", "", "SaveBookToPdf" 
cSOAP.SOAP_AddParameter "pShopId", pShopId 
cSOAP.SOAP_AddParameter "pEncodedHtml", Server.HTMLEncode(pHtml) 
cSOAP.SOAP_SendRequest 
' result = cSOAP.SOAP_GetResult("result") 

クラスから行がエラーを表示するためにあなたはおそらく「次へエラーの履歴書」を、それは(現在は「」)動作するためにあなたの名前空間を設定する必要があり、そしてコメントを解除します。

+0

CashFlow.comのコードを使ってSOAPエンベロープを生成しようとしましたが、うまく動作しないようです。私はエラーを出さず、サーバー側の呼び出しであるため、デバッグするのは非常に難しいです。何が間違っているのだろうか? –

+0

エラーをスローするために 'on error resume next'をすべて削除しましたか?行37-40をResponse.Write(SOAP_REQUEST)に一時的に置き換えて、送信しようとしているもの(またはVisual Studioなどでデバッグ)を確認します。 – akiller

+0

はい、「エラーが発生しました」という記述をすべて削除しました。 SOAPリクエストは必要なように見えます。私はそれをwebserviceによって提供された定義と比較し、すべてがそうであるように見えます。 –

0

AnthonyWJonesはURLエンコーディングとHTMLエンコーディングについて言及していましたが、経験している元の問題はおそらく2つの競合条件です。 isは回答と見なされていましたが、部分的ではありませんでした。うまくいけば、これが効果の原因に答えます。

メッセージがHTMLEncodedになると、タグのhtmlエンティティは '<' = '& lt;'になります。

URLエンコードでは、&の区切りパラメータです。従って、このデータの最初の部分strEnvelope = "pShopId =" & pShopId & "& pEncodedHtml =" & Server.HTMLEncode(PHTML)"& pEncodedHtml"ビット点で最大は、結構です。しかし、その後、「<HTML>が...」...エンコードされていない&年代に、メッセージとして追加され、受信側サーバーはおそらくそれらに区切りされており、基本的に切り捨て『& pEncodedHtml =』 nullを割り当てるには、As:" & pEncodedHtml = & lt; HTML & gt; ... "区切りはURLにあるすべての&で行われます。

したがって、パラメータ& pEncodedHtmlのデータはnullであり、それ以降はcruftとみなされた他のいくつかのパラメータが無視され、実際にはあなたのメッセージになりました。

これは、そのような問題と修正方法に関する追加情報を提供します。

関連する問題