WebRequest.GetResponse() 抛出错误401:未经授权

15

我有一个ASP.NET应用程序,在尝试将先前访问的本地aspx页面输出为HTML(这是报告,并且我想将静态HTML副本存储为档案)。我使用以下代码存储本地页面的URI:

Session["SummaryURI"] = Request.Url.AbsoluteUri;

然后在下一页中,我使用以下代码检索它:

string url = Session["SummaryURI"].ToString();

url = url.Replace("static=false", "static=true");
//MessageLabel.Text = url;

//CREATE THE NEW FILE
WebRequest req = WebRequest.Create(url);
WebResponse res = req.GetResponse();

我得到错误信息 401 Unauthorized,出错的部分是 req.GetResponse()

我需要在IIS中配置什么才能允许这个操作吗?

我需要编辑文件权限或者其他内容吗?

谢谢你的帮助。

顺便说一下,在我的本地IIS上,这个操作很正常,但在测试服务器上不行。


1
请查看此链接:http://social.technet.microsoft.com/Forums/en/winserversecurity/thread/c9239a89-fbee-4adc-b72f-7a6a9648331f - Aristos
4个回答

30

如果您无法启用匿名身份验证,请尝试将以下内容添加到您的WebRequest中:

req.UseDefaultCredentials = true;
req.PreAuthenticate = true;
req.Credentials = CredentialCache.DefaultCredentials;

1
运行得非常好,注意使用了缓存中的默认凭据,如果能提供一些额外的信息就更好了。 - Niklas
太棒了。对我有用。我一直收到401错误,但我知道我是我的URL的授权用户,因为我能够直接访问URL(在浏览器中复制粘贴)。谢谢你。 - coderguy

10

我认为问题是由于测试IIS服务器上的身份验证造成的。

两个选项:

1)在测试IIS服务器上为站点启用“匿名身份验证”。

2)(推荐) 在向测试服务器发出请求之前,请使用以下代码模板以正确的用户名/密码/域信息进行身份验证,以便对测试服务器进行身份验证。

System.Net.NetworkCredential netCredential = 
        new System.Net.NetworkCredential("<USER_NAME>", "<PASSWORD>", "<DOMAIN>");
req.Credentials = netCredential;

1
抱歉回复这么晚,我刚刚回到这个 bug。如果我们使用 NT 认证,这个方法能行吗?我已经尝试传递自己的用户名和密码了 - 但它仍旧不能工作。 - Daniel
我认为需要指出的是,上面的#2代码将非常适用,但有一个要注意的地方。请确保在上述指定行之后不要使用属性“UseDefaultCredientials”(例如UseDefaultCredientials = false;)。这样做将有效地“清除”您刚设置的凭据。 - Bham503

3

目前我没有访问IIS设置的权限,因此无法启用匿名身份验证,这可能是Cybernate的答案不起作用的原因。但我找到了一个更简单的方法,它起作用了。我发现可以使用Server.Execute完成相同的操作,而不必使用WebRequest。下面是我的新解决方案:

string strHTML = String.Empty;
using (var sw = new StringWriter())
{
    Server.Execute([path-to-local-aspx], sw);
    strHTML = sw.ToString();
}

string relativeReportPath = [relative-path-to-new-html-file];

using (StreamWriter writer = File.CreateText(Server.MapPath(relativeReportPath)))
{
    writer.WriteLine(strHTML);
    MessageLabel.Text = "Your report is ready. Click Close to close the window.";
}

1
我刚刚注意到我的这篇文章收到了一些负面评价。显然这是旧的,但是有人可以解释一下为什么他们会投反对票吗?谢谢。 - Daniel
我猜你的解决方案在你的情况下很有效,我们大多数人都是在这里寻找解决方案,发现@Daniel的解决方案是正确的。无论如何,我没有对你的解决方案进行投票,只是猜测为什么有人会对你的解决方案进行投票。 - Esen

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接