Резюме
Как создать HTTPContext в веб-сервисе? или POST в Handler.ashx из веб-сервиса?
Фон
У меня есть веб-приложение Cold Fusion, которое использует проверку подлинности с помощью форм, но как-то выполняет проверку подлинности Windows с помощью этого сценария:
<cfscript>
ws = CreateObject("webservice", "#qTrim.webServiceName#");
ws.setUsername("#qTrim.trimAcct#");
ws.setPassword("#qTrim.trimpwd#");
wsString=ws.UploadFileCF("#qTrim.webserviceurl#","#objBinaryData#", "#qFiles.Filename#", "Document", "#MetaData#");
</cfscript>
- Очевидно, значения setUsername / setPassword сопоставляются с одной учетной записью домена Windows, и это работает в производственной среде. (Веб-сервис написан на C # и построен на .Net 4.0. Он должен использоваться этой учетной записью домена)
- Я разработал DownloadHandler.ashx, который работает, когда POST подключен к процессу, работающему под этой учетной записью домена (у меня есть веб-клиент .Net с кнопкой, которая определяет PostBackUrl = "~ / DownloadHandler.ashx"). Этот HTTPHandler получает несколько элементов из HTTPContext, а затем без проблем вызывает вышеуказанный метод веб-сервиса DownloadFile.
Моя проблема
Теперь этому приложению ColdFusion необходимо загрузить файл с помощью этого веб-сервиса. Когда код CF отправляет HTML-форму в DownloadHandler.ashx, он работает - НО ТОЛЬКО ЕСЛИ тестер CF использует эту учетную запись домена Windows. Это не будет работать в производстве, потому что приложение CF поддерживает удаленных анонимных пользователей посредством проверки подлинности с помощью форм.
Вопрос
Не зная ColdFusion, я думал о следующих изменениях:
Воспроизведите вышеприведенную технику CF так, чтобы user / pswd можно было установить одинаково, и чтобы CF вызывал метод ws.DownloadFile напрямую
Я думаю, что это потребовало бы использования большей части моего текущего кода HTTPHandler в моем веб-сервисе, но я не могу думать о том, как обработать вывод. Когда этот обработчик помещен в POST, он запрашивает OPEN или Save и работает хорошо, но я не совсем понимаю, как мне передать это обратно из самого веб-сервиса.
Текущий веб-метод DownloadFile связывается с продуктом базы данных и возвращает выходные данные этому (текущему) обработчику:
Код
namespace WebClient
{
public class DownloadHandler : IHttpHandler
{
ASMXproxy.FileService brokerService;
public void ProcessRequest(HttpContext context)
{
brokerService = new ASMXproxy.FileService();
string recNumber = context.Request.Form["txtRecordNumber"];
brokerService.Url = context.Request.Form["txtURL"];
string trimURL = context.Request.Form["txtFakeURLParm"]; // not a real URL but parms to connect to TRIM
brokerService.Timeout = 9999999;
brokerService.Credentials = System.Net.CredentialCache.DefaultCredentials;
byte[] docContent;
string fileType;
string fileName;
string msgInfo = brokerService.DownloadFile(trimURL, recNumber, out docContent, out fileType, out fileName);
string ContentType = MIMEType.MimeType(fileType);
context.Response.AppendHeader("Content-Length", docContent.Length.ToString());
context.Response.AppendHeader("content-disposition", "attachment; filename=\"" + fileName + "\"");
context.Response.ContentType = ContentType;
context.Response.OutputStream.Write(docContent, 0, docContent.Length);
context.Response.OutputStream.Flush();
}
public bool IsReusable
{
get
{
return false;
}
}
}
}