我已经编写了一个从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 });
}
}
答案 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的内容。