Ошибка WebRequest.GetResponse() 401: Неавторизованный
У меня есть приложение 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();
Часть req.GetResponse()
- это то, где я получаю свою ошибку (401 Unauthorized
).
Нужно ли мне что-то настраивать в IIS, чтобы это разрешить?
Нужно ли мне редактировать права доступа к файлам или что-то в этом роде?
Спасибо за помощь
Кстати, это отлично работает на моем локальном IIS, но не на моем тестовом сервере.
Ответы
Ответ 1
В настоящее время у меня нет доступа к настройкам IIS, поэтому я не смог включить Anonymous Authentication
, что очень возможно, почему ответ Cybernate не работал на меня. Однако я нашел более простой метод, который сработал. Вместо использования WebRequest
я обнаружил, что могу сделать то же самое с Server.Execute
. Ниже мое новое решение:
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.";
}
Ответ 2
Если вы не можете включить анонимную проверку подлинности, попробуйте добавить это в свой WebRequest:
req.UseDefaultCredentials = true;
req.PreAuthenticate = true;
req.Credentials = CredentialCache.DefaultCredentials;
Ответ 3
Я думаю, что проблема связана с проверкой подлинности на тестовом сервере IIS.
Два варианта:
1) Включите "Анонимную аутентификацию" для сайта на тестовом сервере IIS.
2) (рекомендуется) Перед тем, как сделать запрос для тестирования сервера, используйте шаблон кода ниже с правом имени пользователя/пароля/информации о домене, которая может быть аутентифицирована на тестовом сервере.
System.Net.NetworkCredential netCredential =
new System.Net.NetworkCredential("<USER_NAME>", "<PASSWORD>", "<DOMAIN>");
req.Credentials = netCredential;
Ответ 4
Может быть, прокси беспокоит вас. Посмотрите здесь, чтобы увидеть, как его отключить: Как удалить прокси из WebRequest и оставить DefaultWebProxy нетронутым
Также, возможно, у вас отсутствует косая черта в вашей конечной точке:
Endpoint = $"https://your.api.com/id=111/"; /* <-- attention to the trailing slash */