1

我已经编写了一个从 ColdFusion 页面发布的 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 都位于我本地主机上的虚拟目录的根目录中;目录安全性当前设置为“匿名访问”检查和“集成 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 });
        }
    }
4

2 回答 2

2

您是否尝试过关闭集成 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;

如果您需要添加不同的凭据,您可以尝试网络凭据

这里有一个很好的凭据解释

希望这可以帮助。

于 2009-08-14T20:08:15.843 回答
0

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

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

根据您使用 调用它的方式HttpWebRequest,此变量将为空。然后,当您创建 msgReturn 时,它将如下所示:

?n=XXX%m=YYY

当您重定向到此 URL 时,可能找不到返回 401 的内容。

于 2009-08-14T18:39:36.460 回答