Я уже написал 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 });
        }
    }
1
John Adams 14 Авг 2009 в 22:30

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;

Если вам нужно добавить другие учетные данные, вы можете попробовать Сетевые учетные данные

Здесь есть хорошее объяснение учетных данных.

Надеюсь это поможет.

2
JamieGaines 18 Авг 2009 в 17:30
Хотя я настроен скептически (я хочу отладить файл .ashx и думаю, что для отладчика Vstudio требуется Int.Win.Auth), я решил попробовать вашу идею. Я думаю, что это ухудшило ситуацию, потому что теперь я даже не могу перейти к default.aspx. Я получаю это: HTTP 401.3 - доступ запрещен ACL к ресурсам информационных служб Интернета.
 – 
John Adams
15 Авг 2009 в 00:40
Спасибо за ваше время на это. Я работаю на своем собственном ПК под названием JOHNXP, на котором работают XP и IIS 5.1. Виртуальный каталог называется HTTPHandleTRIM, который указывает на локальный путь: C:\Documents and Settings\johna\My Documents\Visual Studio 2005\Projects\HandlersTRIM. Сначала я добавил JOHNXP\ASPNET в указанную выше папку HandlersTRIM и дал ей разрешения «Чтение & Выполнить", "Список папок" и "Читать". Затем с включенным анонимным доступом И встроенной аутентификацией Windows я получил тот же результат (401 при попытке POST для UploadHandler.ashx). Затем я СНЯЛ «Встроенная аутентификация Windows». (продолжение)
 – 
John Adams
17 Авг 2009 в 21:28
Когда флажок «IWA» не установлен, я даже не смог перейти на свою страницу default.aspx. Итак, я добавил IUSR_JOHNXP и дал анонимному пользователю те же разрешения, что и выше («Чтение и выполнение» и т. д.). Теперь вместо 401 я получаю 302. Есть ли способ получить более подробные коды причин или коды дополнительных состояний для этих ошибок?
 – 
John Adams
17 Авг 2009 в 21:31
MyRequest.Credentials = CredentialCache.DefaultCredentials; - помогло!
 – 
Mediator
17 Сен 2011 в 10:44

Глядя на ваш ProcessRequest(), вы делаете следующее:

string returnURL = context.Request.ServerVariables["HTTP_REFERER"];

В зависимости от того, как вы вызываете ее с помощью HttpWebRequest, эта переменная будет нулевой. Затем, когда вы создадите свой msgReturn, он будет выглядеть примерно так:

?n=XXX%m=YYY

Когда вы перенаправляете на этот URL-адрес, он, вероятно, не будет найден, что и возвращает ошибку 401.

0
Keltex 14 Авг 2009 в 22:39
Спасибо. Ваша точка зрения кажется справедливой, но не могли бы вы подробнее прокомментировать, почему я даже не останавливаюсь на линии, которую вы показываете. То есть, почему возникает ошибка 401 и как я могу это исправить. О возврате к ПОСтеру я позабочусь позже.
 – 
John Adams
14 Авг 2009 в 22:42
Что происходит, когда вы удаляете context.Response.Redirect(msgReturn.ToString());?
 – 
Keltex
14 Авг 2009 в 22:47
Пожалуйста, ознакомьтесь с моим EDIT по вопросу, где я показываю свой пересмотренный ProcessRequest() в файле .ashx..... Однако trace.axd показывает ту же ошибку 401, поэтому пока это не имеет значения.
 – 
John Adams
14 Авг 2009 в 22:59