我有.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服务时不知道。
任何知道如何解决这个棘手问题的人?
答案 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的数据为空,并且接下来是其他几个被认为是残留的参数,可能会被忽略,这恰好恰好是您的消息。
希望这提供有关其类似问题以及如何纠正的其他信息。