为什么我的httpwebrequest发布到myhandler.ashx的帖子被拒绝,状态码为401

时间:2009-08-14 18:30:24

标签: asp.net httpwebrequest localhost http-status-codes http-status-code-401

我已经编写了一个从ColdFusion页面获取POST的HTTPHandler,它运行成功;现在,我正在尝试在ASP.NET中编写Web应用程序,以便我可以从.aspx页面将表单发布到.ashx处理程序。

应用程序跟踪(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都在我的localhost上的虚拟目录的根目录中;目录安全性当前设置为“匿名访问”CHECKED和“集成Windows身份验证”CHECKED。

当我单击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 个答案:

答案 0 :(得分:1)

您是否尝试过关闭集成Windows身份验证并只是匿名检查?它有所作为吗?

您的回答:“我认为这会让事情变得更糟,因为现在我甚至无法浏览到default.aspx。我明白了:HTTP 401.3 - ACL在资源Internet信息服务上拒绝访问”

我的回答:这实际上是一件好事。这意味着我们正在接近正在发生的事情。如果您收到该错误消息,并且您启用的唯一内容是通过IIS进行匿名身份验证,则表示ASP.NET模拟用户对相关文件没有NTFS权限。

我不确定你是使用XP还是Win 2k3,但现在要检查并确保ASPNET(XP)或网络服务(Win 2k3)用户至少具有对文件的读取权限题。确保用户至少具有该级别的访问权限,然后让我知道它是如何进行的。

更新:我不知道为什么我之前没想过这个。您可能需要在HttpWebRequest上设置凭据。要使用当前用户的凭据,请尝试将其添加到您的请求中。

HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(URI);
myRequest.Credentials = CredentialCache.DefaultCredentials;

如果您需要添加其他凭据,可以尝试Network Credentials

good explanation of credentials here

希望这有帮助。

答案 1 :(得分:0)

查看ProcessRequest(),执行以下操作:

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

根据您使用HttpWebRequest调用它的方式,此变量将为null。然后在创建msgReturn时,它看起来像这样:

?n=XXX%m=YYY

当您重定向到此网址时,可能无法找到返回401的内容。