Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 经典ASP中对webservice的服务器端调用_Asp.net_Web Services_Asp Classic - Fatal编程技术网

Asp.net 经典ASP中对webservice的服务器端调用

Asp.net 经典ASP中对webservice的服务器端调用,asp.net,web-services,asp-classic,Asp.net,Web Services,Asp Classic,我有一个.NETWebService,它将一个编码的html字符串作为参数,解码该字符串并从html创建PDF。我想从一个经典的asp网页对Web服务进行同步服务器端调用。如果使用纯文本字符串(没有html标记),效果很好,但是当我向webservice发送编码的html字符串时,当字符串到达webservice时,它似乎是空的 当我使用纯文本字符串和编码的html字符串从客户端调用Web服务时,它运行良好 我的代码如下所示: Private Sub SaveBookHtmlToPdf(pHtm

我有一个.NETWebService,它将一个编码的html字符串作为参数,解码该字符串并从html创建PDF。我想从一个经典的asp网页对Web服务进行同步服务器端调用。如果使用纯文本字符串(没有html标记),效果很好,但是当我向webservice发送编码的html字符串时,当字符串到达webservice时,它似乎是空的

当我使用纯文本字符串和编码的html字符串从客户端调用Web服务时,它运行良好

我的代码如下所示:

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
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")
闻起来服务器上有某种安全问题。它在客户端发布异步调用时起作用,但在服务器端发布异步调用时不起作用——似乎在对Web服务的服务器端调用中不允许使用编码的html字符串


有谁知道如何解决这个棘手的问题吗?

我觉得这完全错了:

 Server.HTMLEncode(pHtml)
开发人员很容易混淆HTML编码和URL编码,尽管它们非常不同。您正在发布需要URL编码的数据。因此,您的代码应该使用
URLEncode

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

URLEncode
所做的一件事可能与URLEncoded post不兼容,那就是它将空格转换为“+”而不是“%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")

在我看来,这一切都错了:

 Server.HTMLEncode(pHtml)
开发人员很容易混淆HTML编码和URL编码,尽管它们非常不同。您正在发布需要URL编码的数据。因此,您的代码应该使用
URLEncode

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

URLEncode
所做的一件事可能与URLEncoded post不兼容,那就是它将空格转换为“+”而不是“%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")

这可能有帮助,也可能没有帮助,但我使用了一个方便的解决了一些问题,我做它手动。您的代码如下所示:

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
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 error resume next”行以显示错误。

这可能有帮助,也可能没有帮助,但我使用了一个handy,它解决了我手动操作时遇到的一些问题。您的代码如下所示:

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
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 error resume next”行的注释以显示错误。

AnthonyWJones强调了URL编码和HTML编码,最初遇到的问题很可能是两者的结合,如果您愿意,这是一种竞争条件。虽然人们认为答案是肯定的,但部分答案是否定的,希望这能回答结果的原因


因此,当消息被HTMLEncoded时,标记的html实体就变成了这样,AnthonyWJones强调了URL编码和html编码,而最初遇到的问题很可能是两者的结合,如果你愿意的话,这是一种竞争条件。虽然人们认为答案是肯定的,但部分答案是否定的,希望这能回答结果的原因


因此,当消息被HTMLEncoded时,标记的html实体变成了这样的“使用你能找出你真正发送的是什么以及web服务消息是什么吗?对web服务的调用是在服务器端完成的,所以很遗憾,我不能使用Fiddler。我试图将发送到web服务的数据打印到屏幕上,看起来应该是这样的,但不知何故,当它到达web服务时,带有编码html字符串的参数似乎是空的。@Steffen:您使用的是什么版本的IIS?你有可以安装Fiddler的测试服务器或开发机器吗?@AnthonyWJones我用的是IIS7,但不幸的是,我无法访问允许安装Fiddler的测试服务器。@Steffen:您至少可以在本地开发机器上运行ASP站点吗?使用可以找出您真正发送的内容以及web服务消息是什么?对web服务的调用是在服务器端完成的,因此不幸的是,我不能使用Fiddler。我试图将发送到web服务的数据打印到屏幕上,看起来应该是这样的,但不知何故,当它到达web服务时,带有编码html字符串的参数似乎是空的。@Steffen:您使用的是什么版本的IIS?你有可以安装Fiddler的测试服务器或开发机器吗?@AnthonyWJones我用的是IIS7,但不幸的是,我无法访问允许在其中安装Fiddler的测试服务器。@Steffen:您至少可以在本地开发机器上运行ASP站点吗?我试图使用CashFlow.com中的代码生成SOAP信封,但似乎无法使其正常工作。我没有收到错误,因为这是一个服务器端调用,所以很难调试。有什么想法可能是错误的吗?你是否删除了所有的“错误恢复下一步”以便它会抛出错误?将第37-40行临时替换为Response.Write(SOAP_请求)以查看它试图发送的内容(或在Visual Studio中调试等)。是的,我已删除所有“on error”语句。SOAP请求看起来应该是这样的。我将其与WebService提供的定义进行了比较