服务器端调用经典ASP中的webservice

时间:2012-01-04 08:39:13

标签: asp.net web-services asp-classic

我有.NET webservice,它将编码的html字符串作为参数,对字符串进行解码并从html创建PDF。我想从经典的asp网页对web服务进行同步服务器端调用。如果使用纯文本字符串(没有html标签),它可以正常工作,但是当我发送一个编码的html字符串时,webservice似乎字符串在到达webservice时是空的。

当我从客户端调用web服务时,它正常工作,包括纯文本字符串和编码的html字符串。

我的代码如下所示:

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服务时不知道。

任何知道如何解决这个棘手问题的人?

3 个答案:

答案 0 :(得分:1)

这对我来说完全没错:

 Server.HTMLEncode(pHtml)

开发人员很容易混淆 HTML 编码和 URL 编码,即使它们完全不同。您发布的数据需要网址编码。因此,您的代码应使用URLEncode代替:

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

修改

URLEncode可能与URLEncoded帖子不兼容的一件事是将空格转换为“+”而不是“%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")

答案 1 :(得分: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")

您可能需要设置命名空间才能使其正常工作(“”当前),并从类中取消注释“on next resume next”行以显示错误。

答案 2 :(得分:0)

AnthonyWJones提出了关于URL编码和HTML编码的观点,而正在经历的原始问题可能是两者的结合,如果你愿意的话就是竞争条件。虽然被认为是回答,但部分不是,希望这可以解决影响的原因。

因此,当消息获得HTMLEncoded时,标签的html实体变为'<' ='& lt;'。

正如您所知,在URLEncoding中,&分隔参数;因此,该数据的第一部分 strEnvelope =“pShopId =”& pShopId& “& pEncodedHtml =”& Server.HTMLEncode(pHtml)直到“& pEncodedHtml”位,没问题。但随后“< HTML> ...”被添加为消息,带有未编码的&'...并且接收服务器可能正在分隔它们并基本上截断“& pEncodedHtml =”作为空分配:“& pEncodedHtml =& lt; HTML& gt; ...。”分隔将在URL中找到的所有内容上完成。

因此,就服务器而言,参数& pEncodedHtml的数据为空,并且接下来是其他几个被认为是残留的参数,可能会被忽略,这恰好恰好是您的消息。

希望这提供有关其类似问题以及如何纠正的其他信息。