Лучший способ вернуть строку из HTTPHandler на страницу, которая помещает этот файл .ashx

2

У меня есть ASP.Net HTTPHandler, который получает POSTed с веб-страницы ColdFusion, FORM которой выглядит примерно так:

<form name="sendToHandler" action="http://johnxp/FileServiceDemo2005/UploadHandler.ashx" method="post">
<input type="hidden" name="b64fileName" value="fileservice.asmx.xml" />
<input type="hidden" name="strDocument" value="Document" />
<input type="submit" name="submitbtn"  value="Submit" />

Каков наилучший способ для этого .Net Handler вернуть строку на страницу POSTing ColdFusion?

Обновление EDIT 14 августа 2009 года:

Решение, появившееся в моем файле .ashx, связано с сохранением URL файла .cfm, который POSTed моего обработчика и добавления строки запроса с результирующей строкой, которую я хочу передать обратно в ColdFusion. Мой CF-коллега использует наличие или отсутствие этих данных запроса для форматирования веб-страницы .cfm соответственно:

public void ProcessRequest(HttpContext context)
    {
        string returnURL = context.Request.ServerVariables["HTTP_REFERER"];  // posting CFM page
        string message = UploadFile(context);    // handles all the work of uploading a file
        StringBuilder msgReturn = new StringBuilder(returnURL);
        msgReturn.Append("?n=");
        msgReturn.Append(HttpUtility.UrlEncode(TRIMrecNumAssigned));
        msgReturn.Append("&m=");  // this is just a msg with performance data about the upload operation (elapsed time, size of file, etc.)
        msgReturn.Append(HttpUtility.UrlEncode(message));
        context.Response.Redirect(msgReturn.ToString());
    }
Теги:
post
coldfusion
httphandler

3 ответа

11
Лучший ответ

Просто напишите строку непосредственно в объекте ответа в методе ProcessRequest.

public void ProcessRequest(System.Web.HttpContext context)
{
    context.Response.Write(mystring);
}
  • 0
    Благодарю. Это работает, но возвращаемая «строка» должна использоваться исходной страницей публикации. Отправляя его обратно в объект Response, он визуально присутствует в браузере, но как лучше сообщить странице CF для публикации, что это за значение? Если я знаю URL-адрес HTTPReferer при входе в мой код .ashx, было бы целесообразно сделать что-то вроде Response.Redirect и передать возвращенную строку в URL как строку запроса?
  • 1
    Это, безусловно, может сработать, но похоже, что вы захотите рассмотреть решение на основе Ajax, в котором вы отправляете форму, используете функцию обратного вызова для обработки результата и обновляете часть страницы, которая должна отображать ее.
Показать ещё 2 комментария
1

Вы можете создать JSON из вашего обработчика HTTP и использовать jquery.post для отправки данных формы и получения результатов на странице ColdFusion.

  • 0
    @ Mehrdad - я могу исследовать, как генерировать JSON, но я не понимаю, как интерпретировать остальную часть вашего предложения. Вы хотите сказать, что страница ColdFusion будет делать что-то кроме предоставления кнопки для отправки формы? Мой код обработчика .ashx прекрасно получает данные формы из ColdFusion - будет ли этот jquery.post быть тем, что парень ColdFusion должен сделать, чтобы каким-то образом обрабатывать возврат из моего HttpHandler?
  • 0
    Да, вам нужно иметь контроль на странице холодного синтеза. Однако модификация зависит от характера постобработки, которую необходимо выполнить сценарию холодного синтеза. Если вам просто нужно отобразить что-то на стороне клиента, мой метод работает хорошо. Вы в основном добавляете некоторую функциональность на стороне клиента, которая что-то публикует и отображает результат на странице (полностью на клиенте, без сценария холодного синтеза). Однако, если вам нужно выполнить некоторую обработку на стороне сервера (скажем, как отчет о транзакции из внешнего платежного сервиса), это не подходит.
0

Если вы хотите, чтобы ColdFusion знал, что возвращается, тогда есть два способа обойти это.

Первое - вернуть строку в форму (как предложено womp), а затем обработать ее из браузера либо путем отправки вторичной формы, либо каких-либо других средств. Поскольку это похоже на то, что все значения в форме предоставляются вместо поставляемого пользователем, это не то, что я бы сделал.

Второй способ заключается в том, чтобы CF обрабатывал сам пост формы. Предполагая, что значения, передаваемые вашей формой, доступны для CF, вы можете использовать CFHTTP для "подделки" сообщения формы. CF будет возвращен результат напрямую, и вы сможете обработать ответ оттуда.

  • 0
    @Ben Doom: для метода 1 я попробовал оригинальное предложение Womp'а о простом возврате строки в объекте Response (еще ничего не сделал с обратным вызовом Ajax). Что вы имеете в виду "справиться с этим из браузера"? Боюсь, что для метода 2 я запутал вас, или вы меня неправильно поняли. Фрагмент, который я поместил выше, представляет собой <form> на странице CF, которая отправляется в мой код .ASHX (у меня нет «формы» в моей стороне .Net). Мой обработчик похож на страницу только с кодом, без HTML. Мой .ashx должен быть как невидимый слой между пользовательским интерфейсом ColdFusion и веб-сервисами .Net, которые нужно вызывать.
  • 0
    @John Galt: CF только на стороне сервера, поэтому он не знает, что происходит на стороне клиента, пока клиент не отправит сообщение. AJAX, как вы упомянули, был бы одним из способов сделать это. Вторая форма отправки в CF (после первой в .NET) будет другой. Если клиент не взаимодействует с формой, поэтому он просто отправляет в службу .NET без изменений, это может быть обработано CF с использованием CFHTTP без какого-либо участия клиента. Другими словами, вместо создания формы для отправки CF отправляет форму.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню