0

我们有一个第三方软件,它期望传入的 Content-Type 是明确的:

应用程序/x-www-form-urlencoded

然而,在我们下面的 ASP 脚本中,即使我们适当地设置了请求标头,ASP 实际上将其发送为:

应用程序/x-www-form-urlencoded;字符集=utf-8

结果,身份验证失败,并且由于它是第三方,我们可能无法自行修补它,因为未来的更新可能会覆盖我们的修改。

我们如何明确强制 Content-type 并防止附加“; charset=utf-8”?

<%
'IRISLink.cgi expects application/x-www-form-urlencoded

Dim obHTTP
obHTTP.open "POST", "https://" & DWHost & "/IRISLink.cgi", False

obHTTP.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
obHTTP.Send strPost
Set obHTTP = Nothing

'Failure - Actual Content-type received was: application/x-www-form-urlencoded; charset=utf-8
%>
4

2 回答 2

1

我不确切知道您使用的是哪个对象,但根据我的测试,我只能重现您在使用MSXML2.ServerXMLHTTP. 这通常指向 MSXML 3.0 版本。一个相对直接的解决方法是显式使用不同版本的 MSXML,例如MSXML2.ServerXMLHTTP.6.0.

如果由于某种原因无法实现,则可以将ADODB.Stream对象send而不是字符串传递给方法。有关此示例,请参阅我的测试脚本。

测试脚本:

Option Explicit

Dim strPost
strPost = "Testing 1,2,3"

Dim oStream
Set oStream = CreateObject("ADODB.Stream")
oStream.Open
oStream.Type = 2 ' adTypeText
oStream.Charset = "UTF-8" ' or whatever charset the 3rd party app requires
oStream.WriteText strPost

' skip UTF-8 BOM (see http://stackoverflow.com/questions/4143524)
' If you're using a different charset, you should set Position to 0
oStream.Position = 3

Dim oHttp
Set oHttp = CreateObject("Msxml2.ServerXMLHTTP")
oHttp.open "POST", "http://example.com/", False

oHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
oHttp.send oStream
'oHttp.send strPost
oStream.Close
于 2013-09-30T06:47:41.840 回答
0

看来这是经典 ASP 的限制,无法避免。将相同的代码移植到 C# 中,我们发现 Content-type 是按照指定的字面意思接收的,但不是通过 ASP 接收的。

于 2013-09-27T23:09:40.717 回答