Как http-обработчик должен заполнить свойство responsetext вызывающего объекта xmlhttp? - PullRequest
2 голосов
/ 23 декабря 2008

Я пытаюсь реализовать дескриптор http (.ashx), используя asp.net для среды, где клиенты будут использовать serverxmlhttp для запроса информации от обработчика. Вот код до сих пор ...

CLIENT.ASPX

<%@ Page Language="VB" %>
<%
    On Error Resume Next
    Dim myserver_url As String = "http://mydomain.com/Server.ashx"
    Dim myparameters As String = "one=1&two=2"
    Dim xmlhttp As Object
    xmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP.4.0")
    xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
    xmlhttp.open("POST", myserver_url, False)
    xmlhttp.Send(myparameters)
    If xmlhttp.Status = 200 Then        
        Dim myresults As String = ""   
        myresults = xmlhttp.responsetext
        Response.Clear()
        Response.Write("<html><body><h1>" & myresults & "</h1></body></html>")
    End If
    xmlhttp = Nothing   
%>

SERVER.ASHX

<%@ WebHandler Language="VB" Class="MyServerClass" %>

Imports System
Imports System.Web

Public Class MyServerClass : Implements IHttpHandler

    Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
        context.Response.ContentType = "text/plain"
        context.Response.Write("hi there")
    End Sub

    Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
        Get
            Return False
        End Get
    End Property

End Class

... моя проблема в том, что строка myresults в коде клиента всегда пуста. Вопрос: Как http-дескриптор должен заполнять свойство responsetext объекта xmlhttp, который его вызвал?

Приложение: Я также реализовал server.ashx как файл aspx, но myresults все еще оставалось пустым. Вот этот код.

SERVER.ASPX

<%@ Page Language="VB" %>

<%
    Response.ContentType = "text/plain"
    Response.Write("hi there")
%>

Заранее спасибо за помощь! Мир, Генри Э. Тейлор

1 Ответ

2 голосов
/ 24 декабря 2008

В вашем файле CLIENT.ASPX есть несколько ошибок. Из того, что я вижу, вы используете серверный код для создания экземпляра элемента управления ActiveX, позволяющего сделать HTTP-запрос к SERVER.ASHX и прочитать поток ответов, который, в свою очередь, записывается в поток ответов на странице CLIENT.ASPX. Тот факт, что вы используете элемент управления ActiveX вместо стандартных .NET classes , заставляет меня думать, что вы переносите старый ASP-сайт в .NET. В этом случае первым делом нужно пометить ваши страницы директивой AspCompat = true :

<%@ Page Language="VB" AspCompat="true" %>

Следует также отметить, что вы используете неправильное имя ActiveX MSXML2.ServerXMLHTTP.4.0 вместо MSXML2.ServerXMLHTTP . Также вы пытаетесь установить заголовки запроса с помощью метода setRequestHeader перед вызовом метода open . Тот факт, что вы написали оператор On Error Resume Next , помешал вам увидеть все эти ошибки. Код только что прошел, и ваш обработчик SERVER.ASHX фактически никогда не выполнялся, поэтому вы получили пустой ответ. Вот исправленная версия вашего кода CLIENT.ASPX:

<%@ Page Language="VB" AspCompat="true" %>
<%
    Dim myserver_url As String = "http://mydomain.com/Server.ashx"
    Dim myparameters As String = "one=1&two=2"
    Dim xmlhttp As Object
    xmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP")

    xmlhttp.open("POST", myserver_url, False)
    xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
    xmlhttp.Send()
    If xmlhttp.Status = 200 Then        
        Dim myresults As String = ""   
        myresults = xmlhttp.responseText
        Response.Clear()
        Response.Write("<html><body><h1>" & myresults & "</h1></body></html>")
    End If
    xmlhttp = Nothing   
%>

Конечно, предпочтительным способом достижения этого является либо использование клиентского языка сценариев, такого как javascript, либо, если вы хотите сделать это на стороне сервера, тогда используйте стандартные классы .NET вместо элементов управления ActiveX.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...