Я написал приложение, которое прекрасно работало в течение нескольких месяцев, но в последние несколько дней я получаю ошибку, описанную ниже, только на установленной версии.
Если я запускаю исходный код в VS, все работает нормально. Кроме того, .exe в папках bin работает нормально. Только установленная версия выдает ошибку, если я перекомпилирую и переустановлю, я получаю ту же ошибку.
Я немного запутался в причинах этого и надеюсь на несколько советов. Похоже, что ответ WebRequest через IE не возвращается, но я в тупике, почему он работает нормально в VS без каких-либо ошибок. Есть ли какие-то новые меры безопасности IE, которые могут вызвать это?
До сих пор я пробовал следующее:
Исключение:
Exception: System.Windows.Markup.XamlParseException: The invocation of the constructor on type 'XApp.MainWindow' that matches the specified binding constraints threw an exception. ---> System.Net.WebException: The remote server returned an error: (403) Forbidden.
at System.Net.HttpWebRequest.GetResponse()
at XApp.HtmlRequest.getHtml(Uri uri) in J:\Path\MainWindow.xaml.cs:line 3759
at XApp.MainWindow.GetLinks() in J:\Path\MainWindow.xaml.cs:line 2454
at XApp.MainWindow..ctor() in J:\Path\MainWindow.xaml.cs:line 124
--- End of inner exception stack trace ---
at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
at System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri)
at System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream)
at System.Windows.Application.LoadBamlStreamWithSyncInfo(Stream stream, ParserContext pc)
at System.Windows.Application.LoadComponent(Uri resourceLocator, Boolean bSkipJournaledProperties)
at System.Windows.Application.DoStartup()
at System.Windows.Application.<.ctor>b__1(Object unused)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
Exception: System.Net.WebException: The remote server returned an error: (403) Forbidden.
at System.Net.HttpWebRequest.GetResponse()
at XApp.HtmlRequest.getHtml(Uri uri) in J:\Path\MainWindow.xaml.cs:line 3759
at XApp.MainWindow.GetLinks() in J:\Path\MainWindow.xaml.cs:line 2454
at XApp.MainWindow..ctor() in J:\Path\MainWindow.xaml.cs:line 124
EDIT:
Это установлено как отдельное приложение. Когда я запускаю от имени администратора, я открываю папку программы и запускаю exe от имени администратора, а не ярлык.
Код, который вызывает проблему, следующий
private void GetLinks()
{
//Navigate to front page to Set cookies
HtmlRequest htmlReq = new HtmlRequest();
OLinks = new Dictionary<string, List<string>>();
string Url = "http://www.somesite.com/somepage";
CookieContainer cookieJar = new CookieContainer();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
request.CookieContainer = cookieJar;
request.Accept = @"text/html, application/xhtml+xml, */*";
request.Referer = @"http://www.somesite.com/";
request.Headers.Add("Accept-Language", "en-GB");
request.UserAgent = @"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)";
request.Host = @"www.somesite.com";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
String htmlString;
using (var reader = new StreamReader(response.GetResponseStream()))
{
htmlString = reader.ReadToEnd();
}
//More Code
}
Добавьте следующую строку:
request.UseDefaultCredentials = true;
Это позволит приложению использовать учетные данные вошедшего пользователя для доступа к сайту. Если приложение возвращает 403, очевидно, что оно ожидает аутентификации.
Также возможно, что между вами и удаленным сайтом (сейчас?) стоит аутентифицирующий прокси-сервер. В этом случае попробуйте:
request.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
Надеюсь, это поможет.
Похоже, что проблема основана на стороне сервера.
В моем случае я работал с сервером paypal и ни один из предложенных ответов не помог, но http://forums.iis.net/t/1217360.aspx?HTTP+403+Forbidden+error
Я столкнулся с этой проблемой и только что получил ответ от технической службы Paypal. Добавьте это, чтобы решить проблему 403.
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.UserAgent = "[любое слово, состоящее более чем из 5 символов]";
.
Это ошибка прав доступа. Вероятно, ваша VS работает под повышенной учетной записью или под учетной записью пользователя, отличной от учетной записи пользователя, использующего установленную версию.
Может быть полезно проверить разрешения IIS и посмотреть, какие учетные записи имеют доступ к ресурсу, к которому вы обращаетесь. Перекрестно укажите учетную запись, которую используете вы, и учетную запись, которую используют установленные версии.
Возможно, это не поможет многим людям, но это был мой случай: Я использовал Jira Rest Api и использовал свои личные учетные данные (те, которые я использую для входа в Jira). Я обновил свой пароль Jira, но забыл обновить его в коде. Я получил ошибку 403, попробовал обновить пароль в коде, но все равно получил ошибку.
Решение: Я попробовал войти в Jira (с их страницы входа), и мне пришлось ввести текст, чтобы доказать, что я не бот. После этого я повторил попытку из кода, и все получилось. Вывод: Возможно, сервер заблокировал вас.
В моем случае я вспомнил, что для этого адреса некоторое время назад была создана дыра в брандмауэре, поэтому мне пришлось установить useDefaultWebProxy="false" для привязки в конфигурационном файле, как если бы по умолчанию использовался прокси, если useDefaultWebProxy не указан.