在经典ASP中使用System.Net.HttpWebRequest?

4

我有一个经典的ASP应用程序,需要向付款引擎提交XML,参考代码使用System.Net.HttpWebRequest对象(asp.net)。在Classic ASP中是否有类似的对象可用于提交XML?

4个回答

6

这是我在ASP中用于进行HTTP请求的小助手函数。它是用JScript编写的,但您至少应该了解一些指针以及我们多年来必须解决的一些麻烦问题。

<%

/*
   Class: HttpRequest
       Object encapsulates the process of making an HTTP Request.

   Parameters:
      url - The gtarget url
      data - Any paramaters which are required by the request.
      method - Whether to send the request as POST or GET
      options - async (true|false): should we send this asyncronously (fire and forget) or should we wait and return the data we get back? Default is false

   Returns:
      Returns the result of the request in text format.

*/

var HttpRequest = function( url, data, method, options  )
{
    options = options ? options : { "async" : false };
    options[ "async" ] = options["async"] ? true : false;

    var text = "";
    data = data ? data : "";
    method = method ? String( method ).toUpperCase() : "POST";

    // Make the request
    var objXmlHttp = new ActiveXObject( "MSXML2.ServerXMLHTTP" );
    objXmlHttp.setOption( 2, 13056 ); // Ignore all SSL errors

    try {
        objXmlHttp.open( method, url, options[ "async" ] ); // Method, URL, Async?
    }
    catch (e)
    {
        text = "Open operation failed: " + e.description;
    }

    objXmlHttp.setTimeouts( 30000, 30000, 30000, 30000 );   // Timeouts in ms for parts of communication: resolve, connect, send (per packet), receive (per packet)
    try {
        if ( method == "POST" ) {
            objXmlHttp.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded" );
        }

        objXmlHttp.send( data );

        if ( options[ "async" ] ) {
            return "";
        }

        text = objXmlHttp.responseText;

    } catch(e) {
        text = "Send data failed: " + e.description;
    }

    // Did we get a "200 OK" status?
    if ( objXmlHttp.status != 200 )
    {
        // Non-OK HTTP response
        text = "Http Error: " + objXmlHttp.Status + " " + Server.HtmlEncode(objXmlHttp.StatusText) + "\nFailed to grab page data from: " + url;
    }

    objXmlHttp = null; // Be nice to the server

    return  text ;
}

%>

如果你将它保存在一个文件中(名为httprequest.asp),那么你可以使用以下代码来调用它:
<%@ Language="JScript" %>
<!--#include file="httprequest.asp"-->
<%

var url = "http://www.google.co.uk/search";
var data = "q=the+stone+roses"; // Notice you will need to url encode your values, simply pass them in as a name/value string

Response.Write( HttpRequest( url, data, "GET" ) );

%>

需要注意的是,如果出现错误,它将返回错误消息,无法捕获。对于我们的需求来说,它表现得很好,如果我们需要更多的保护,那么我们可以创建一个自定义函数来更好地处理错误。

希望这能有所帮助。


+1,这是一个不错的小函数,但它假定一个帖子正在模拟 HTML 表单帖子。我会移除这个假设,并将内容类型头部作为选项对象上的可选属性。你可以设置默认值,但允许外部代码指定它,例如 "text/xml"。 - AnthonyWJones
太对了,安东尼,这是一种根据当时的需求而发展起来的功能,现在正好符合我们的需求。我喜欢在ASP中使用JScript的一个原因是你可以从近年来出现的所有客户端好东西和技巧中学习。通过传递一个选项对象,很容易进行重构,以允许传递“contenttype”选项,同时不破坏当前使用它的任何内容。不过,你提到的观点很好,我可能会考虑将其添加到我们的代码库中 ;) - Pete Duncanson

4

经典 ASP 可以使用 XMLHTTP ActiveX 对象或者通过 MSXML 库提供的 ServerXMLHTTP 对象来发起请求。(MSDN reference)。

这篇 KB 文章 提供了一个很好的关于 ServerXMLHTTP 对象的参考和示例代码。


1
ServerXMLHTTP是在此处使用的选项,不应在服务器端使用XMLHTTP,因为它不是线程安全的。 - AnthonyWJones

2
我认为这个函数的异步版本之所以有效,并避免了在此处讨论的“无发送”错误:
{{link1:如何在经典 ASP 中触发异步调用并忽略响应?}}
是因为在异步版本中,您从未释放 COM 对象 - 这解决了问题,但会造成大量资源泄漏。

1

所有涉及 AJAX 的东西都使用 XMLHttp。
看看这个链接是否有帮助 - http://www.mikesdotnetting.com/Article.aspx?ArticleID=39

编辑:不要接受这个答案。
我所做的就是用谷歌搜索它。你先试过了吗?

我想一些问题可以通过搜索得到答案。
对于其他所有问题,都可以在 StackOverflow 上找到答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接