Удаленный сервер ответил на ошибку: (403) Запрещено
Я написал приложение, которое отлично работало в течение нескольких месяцев, в последние несколько дней я получал ошибку ниже только в установленной версии.
Если я запускаю исходный код в 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
}
Ответы
Ответ 1
Добавьте следующую строку:
request.UseDefaultCredentials = true;
Это позволит приложению использовать учетные данные зарегистрированного пользователя для доступа к сайту. Если он возвращает 403, очевидно, что он ожидает аутентификации.
Также возможно, что у вас (сейчас?) есть аутентификационный прокси-сервер между вами и удаленным сайтом. В этом случае попробуйте:
request.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
Надеюсь, что это поможет.
Ответ 2
Похоже, что проблема основана на стороне сервера.
В моем случае я работал с сервером paypal, и ни один из предложенных ответов не помог, но http://forums.iis.net/t/1217360.aspx?HTTP+403+Forbidden+error
Я столкнулся с этой проблемой и получил ответ от технической поддержки Paypal. Добавьте это, чтобы исправить проблему 403. HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.UserAgent = "[any words that is more than 5 characters]";
Ответ 3
Его ошибка разрешений. Вероятно, ваш VS работает с использованием повышенной учетной записи или другой учетной записи пользователя, чем пользователь, использующий установленную версию.
Может быть полезно проверить ваши разрешения IIS и посмотреть, какие учетные записи имеют доступ к ресурсу, к которому вы обращаетесь. Перекрестная ссылка на используемую учетную запись и учетную запись, которую используют установленные версии.
Ответ 4
private class GoogleShortenedURLResponse
{
public string id { get; set; }
public string kind { get; set; }
public string longUrl { get; set; }
}
private class GoogleShortenedURLRequest
{
public string longUrl { get; set; }
}
public ActionResult Index1()
{
return View();
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult ShortenURL(string longurl)
{
string googReturnedJson = string.Empty;
JavaScriptSerializer javascriptSerializer = new JavaScriptSerializer();
GoogleShortenedURLRequest googSentJson = new GoogleShortenedURLRequest();
googSentJson.longUrl = longurl;
string jsonData = javascriptSerializer.Serialize(googSentJson);
byte[] bytebuffer = Encoding.UTF8.GetBytes(jsonData);
WebRequest webreq = WebRequest.Create("https://www.googleapis.com/urlshortener/v1/url");
webreq.Method = WebRequestMethods.Http.Post;
webreq.ContentLength = bytebuffer.Length;
webreq.ContentType = "application/json";
using (Stream stream = webreq.GetRequestStream())
{
stream.Write(bytebuffer, 0, bytebuffer.Length);
stream.Close();
}
using (HttpWebResponse webresp = (HttpWebResponse)webreq.GetResponse())
{
using (Stream dataStream = webresp.GetResponseStream())
{
using (StreamReader reader = new StreamReader(dataStream))
{
googReturnedJson = reader.ReadToEnd();
}
}
}
//GoogleShortenedURLResponse googUrl = javascriptSerializer.Deserialize<googleshortenedurlresponse>(googReturnedJson);
//ViewBag.ShortenedUrl = googUrl.id;
return View();
}
Ответ 5
Это, вероятно, не поможет слишком многим людям, но это был мой случай: я использовал Jira Rest Api и использовал свои личные учетные данные (те, которые я использую для входа в Jira). Я обновил пароль Jira, но забыл обновить их в своем коде. Я получил ошибку 403, я попробовал обновить свой пароль в коде, но все еще получил ошибку.
Решение: я попытался войти в Jira (со своей страницы входа), и мне пришлось ввести текст, чтобы доказать, что я не бот. После этого я снова попробовал код, и он сработал. Takeaway: сервер, возможно, заблокировал вас.
Ответ 6
В моем случае я вспомнил, что дыра в брандмауэре была создана для этого адреса некоторое время назад, поэтому мне пришлось установить useDefaultWebProxy = "false" на привязку в файле конфигурации, как если бы по умолчанию было использовать прокси-сервер если useDefaultWebProxy не указан.
Ответ 7
Установка:
request.Referer = @"http://www.somesite.com/";
и добавив cookies
, чем работал у меня
Ответ 8
Мы должны получить доступ к сайту, используя имя, указанное в сертификате. ![enter image description here]()
Ответ 9
У меня проблема в строке 19,20,21 System.Net.WebException: удаленный сервер возвратил ошибку: (403) Запрещено.
Строка 17: url + = "& введите код здесьq =" + Server.UrlEncode(txtSource.Text.Trim()); Строка 18: клиент WebClient = новый WebClient(); Строка 19: строка json = client.DownloadString(url); Строка 20: JsonData jsonData = (новый JavaScriptSerializer()). Десериализация (json); Строка 21: txtTarget.Text = jsonData.Data.Translations [0].TranslatedText;