Я уже написал HTTPHandler, который получает POST-сообщение со страницы ColdFusion, и он успешно работает; теперь я пытаюсь написать веб-приложение в ASP.NET, поэтому я могу отправить форму обработчику .ashx со страницы .aspx.
Application Trace (trace.axd) показывает следующее как мои последние 3 записи:
2 8/14/2009 1:53:56 PM /Default.aspx 200 GET View Details
3 8/14/2009 1:54:04 PM /Default.aspx 200 POST View Details
4 8/14/2009 1:54:13 PM /UploadHandler.ashx 401 POST View Details
У меня есть точка останова в моем файле .ashx, но она никогда не достигается (я думаю, из-за кода состояния 401). Вот фрагмент кода из default.aspx, пытающегося выполнить POST обработчику:
protected void UploadHandlerButton_Click(object sender, EventArgs e)
{
if (FileUpload1.HasFile)
{
try
{
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] data = encoding.GetBytes(BuildFormData());
string baseAddress = "http://" + Environment.MachineName;
string pathInfo = Page.ResolveUrl("UploadHandler.ashx");
string URI = baseAddress + pathInfo;
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(URI);
myRequest.Method = "POST";
myRequest.ContentType = "application/x-www-form-urlencoded";
myRequest.ContentLength = data.Length;
Stream newStream = myRequest.GetRequestStream();
newStream.Write(data, 0, data.Length);
newStream.Close();
}
catch (Exception someError)
{
LogText("FAILURE: " + someError.Message);
}
}
}
Вот фрагмент кода из файла UploadHandler.ashx (но, похоже, он недоступен):
public void ProcessRequest(HttpContext context)
{
string returnURL = context.Request.ServerVariables["HTTP_REFERER"];
string message;
message = UploadFile(context);
StringBuilder msgReturn = new StringBuilder(returnURL);
msgReturn.Append("?n=");
msgReturn.Append(HttpUtility.UrlEncode(TRIMrecNumAssigned));
msgReturn.Append("&m=");
msgReturn.Append(HttpUtility.UrlEncode(message));
context.Response.Redirect(msgReturn.ToString());
}
И default.aspx, и UploadHandler.ashx находятся в корне виртуального каталога на моем локальном хосте; в настоящее время для безопасности каталога установлено значение «Анонимный доступ» ПРОВЕРЕНО и «Встроенная проверка подлинности Windows» ПРОВЕРЕНО.
Когда я нажимаю ссылку «Просмотреть подробности» на дисплее trace.axd, я вижу все данные в коллекции Forms, которые я ожидаю увидеть и надеюсь обработать, но этот 401, кажется, останавливает все. Я мог бы опубликовать код моей маленькой функции под названием BuildFormData(), если это будет полезно.
РЕДАКТИРОВАТЬ: Пересмотренный обработчик следующим образом (не имел никакого эффекта, возникает та же ошибка):
public void ProcessRequest(HttpContext context)
{
//-----------------------------------------------------------------------------------------
// the remainder of this block is alternative to the .Redirect and is useful for debugging.
context.Response.ContentType = "text/html";
//context.Response.Write(TRIMrecNumAssigned);
//context.Response.Write("<p>");
//context.Response.Write(msgReturn);
context.Response.Write("<H1>Trim - Kerberos Prototype for ColdFusion consuming pages</h1>");
HttpContext.Current.Trace.IsEnabled = true;
HttpContext.Current.Trace.Write(null);
HttpContext.Current.Trace.Write("-------");
HttpContext.Current.Trace.Write(context.Request.Form["txtTrimRecordType"]);
HttpContext.Current.Trace.Write(GetUserInfo());
HttpContext.Current.Trace.Write("-------");
HttpContext.Current.Trace.Write(null);
using (Html32TextWriter htw = new Html32TextWriter(context.Response.Output))
{
typeof(TraceContext)
.GetMethod("Render", BindingFlags.NonPublic | BindingFlags.Instance)
.Invoke(HttpContext.Current.Trace, new object[] { htw });
}
}
2 ответа
Вы пытались отключить встроенную проверку подлинности Windows и просто оставить анонимный флажок? Есть ли разница?
Ваш ответ: "Я думаю, что это ухудшило ситуацию, потому что теперь я даже не могу перейти к default.aspx. Я получаю это: HTTP 401.3 - Доступ запрещен ACL к ресурсу Internet Information Services"
Мой ответ: На самом деле это хорошо. Это означает, что мы приближаемся к тому, что происходит. Если вы получаете это сообщение об ошибке и единственное, что вы включили, — это анонимная проверка подлинности через IIS, это означает, что пользователь олицетворения ASP.NET не имеет разрешений NTFS для рассматриваемых файлов.
Я не уверен, используете ли вы XP или Win 2k3, но теперь вы хотите проверить и убедиться, что пользователи ASPNET (XP) или Network Service (Win 2k3) имеют как минимум доступ для чтения к рассматриваемым файлам. Убедитесь, что у пользователя есть хотя бы этот уровень доступа, а затем дайте мне знать, как это происходит.
Обновление: не знаю, почему я не подумал об этом раньше. Возможно, вам потребуется установить учетные данные в файле HttpWebRequest. Чтобы использовать учетные данные текущего пользователя, попробуйте добавить это в свой запрос.
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(URI);
myRequest.Credentials = CredentialCache.DefaultCredentials;
Если вам нужно добавить другие учетные данные, вы можете попробовать Сетевые учетные данные
Здесь есть хорошее объяснение учетных данных.
Надеюсь это поможет.
Глядя на ваш ProcessRequest(), вы делаете следующее:
string returnURL = context.Request.ServerVariables["HTTP_REFERER"];
В зависимости от того, как вы вызываете ее с помощью HttpWebRequest
, эта переменная будет нулевой. Затем, когда вы создадите свой msgReturn, он будет выглядеть примерно так:
?n=XXX%m=YYY
Когда вы перенаправляете на этот URL-адрес, он, вероятно, не будет найден, что и возвращает ошибку 401.
Похожие вопросы
Связанные вопросы
Новые вопросы
asp.net
ASP.NET - это среда разработки веб-приложений Microsoft, которая позволяет программистам создавать динамические веб-сайты, веб-приложения и веб-службы. Полезно использовать этот тег в сочетании с тегом типа проекта, например, [asp.net-mvc], [asp.net-webforms] или [asp.net-web-api]. НЕ используйте этот тег для вопросов о ASP.NET Core - используйте вместо этого [asp.net-core].