I’ve written an app that has worked fine for months, in the last few days I’ve been getting the error below on the installed version only.
If I run the source code in VS everything works fine. Also, the .exe in the bin folders work fine. It’s only the installed version which generates the error, if I recompile and reinstall I get the same error.
I’m a bit stumped as to what’s causing this and hoped for a few pointers. It seems to be a WebRequest response through IE is not being returned but I’m stumped as to why it works fine in VS without any errors. Are there any new IE security measures/polices that may cause this?
Things I’ve tried so far include:
- Disabled all AntiVirus & Firewall
- Run as Administrator
The Exception:
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:
This is installed as a standalone app. When I’ve run as Administrator, I’ve opened the program folder and run the exe as administrator rather than the shortcut.
The code that causes the issue is this
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
}
Иногда веб-серверы фильтруют клиентов (браузеры, программные веб-клиенты, etc) по HTTP-заголовку User-Agent
. И в зависимости от значения этого заголовка веб-сервер может принят решение о вполне определенном ответе клиенту.
В конкретно этом случае веб-сервер (h92761ae.beget.tech) «не любит» обращения от «не реальных» браузеров, например:
curl http://h92761ae.beget.tech/json_devices.php
вернет код 403 Forbidden
. Так как User-Agent
в этом случае был curl/7.29.0
Поэтому нам можно попробовать притвориться реальным браузером с User-Agent-ом, например, Mozilla/5.0
. И это решит данную проблему.
WebClient _webClient = new WebClient { Encoding = Encoding.UTF8 };
_webClient.Headers["User-Agent"] = "Mozilla/5.0";
var devices = _webClient.DownloadString("http://h92761ae.beget.tech/json_devices.php");
Console.WriteLine(devices);
Естественно, такой подход не решит проблемы, если вам будет запрещено ходить на этот сервер, например, по ip-адресу. Но это уже не вопрос данной темы.
- Remove From My Forums
-
Вопрос
-
Пишу приложение на Silverlight 4+WCF. На одной из страниц обращаюся к веб-камере и делаю снимок, который потом через веб-сервис отправляю в базу данных MSSQL. Когда передаю масив байтов в котором содержится снимок (размерность масива всегда передается одинаковая
— [1228800]) получаю ошибку из веб-сервиса — Удаленный сервер возвратил ошибку Not Found. Что делать?Я пробовал отсылать пустой масив такой же размерности — все равно та же ошибка. Мой веб-конфиг:
<?xml version="1.0"?> <!-- Дополнительные сведения по настройке приложения ASP.NET см. по ссылке http://go.microsoft.com/fwlink/?LinkId=169433 --> <configuration> <connectionStrings> <add name="UserBaseConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True" providerName="System.Data.SqlClient" /> </connectionStrings> <system.serviceModel> <bindings> <basicHttpBinding> <binding name="ServicesBinding" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647" openTimeout="0:1:0" receiveTimeout="0:1:0" sendTimeout="0:1:0" closeTimeout="0:1:0"> <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/> </binding> </basicHttpBinding> </bindings> <services> <service behaviorConfiguration="Shmel.Web.MyServiseBehavior" name="Shmel.Web.MyServise"> <endpoint address="" binding="basicHttpBinding" bindingConfiguration="ServicesBinding" contract="Shmel.Web.IMyServise"> <identity> <dns value="localhost"/> </identity> </endpoint> </service> </services> <behaviors> <serviceBehaviors> <behavior name="Shmel.Web.MyServiseBehavior"> <serviceMetadata httpGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="false"/> </behavior> <behavior name=""> <serviceMetadata httpGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="false"/> </behavior> </serviceBehaviors> </behaviors> <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/> </system.serviceModel> <system.web> <compilation debug="true"/></system.web></configuration>
Помогите.
Ответы
-
я забрал, но та же ошибка. к тому же другие методы работают прекрасно, так что проблема не в idenity.
Я думаю что проблема в самом масиве, может он слишком большой чтобы его передавать? Но в конфиге все на максимум настроил.
Если передавать масив меньше, то все работает.
ах да, вот еще ClientConfig
<configuration> <system.serviceModel> <bindings> <basicHttpBinding> <binding name="BasicHttpBinding_IService1" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" > <security mode="None" /> </binding> </basicHttpBinding> </bindings> <client> <endpoint address="http://localhost:49160/Service1.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService1" contract="ServiceReference1.IService1" name="BasicHttpBinding_IService1" /> </client> </system.serviceModel> </configuration>
-
Изменено
24 июня 2012 г. 9:02
-
Помечено в качестве ответа
Abolmasov DmitryModerator
29 июня 2012 г. 7:23
-
Изменено
-
«Я думаю что проблема в самом масиве, может он слишком большой чтобы его передавать?» — да, именно так. По умолчанию конфигурация такова, чтобы принимать маленькие порции данных, защитив таким образом от DoS атак.
«Но в конфиге все на максимум настроил.» — видимо настройки не те. Нужно разбираться дальше в настройках, сам пока я с этим не сталкивался. А как одно из решений: можете отправлять данные порциями, а потом объединять их на сервере.-
Помечено в качестве ответа
Abolmasov DmitryModerator
29 июня 2012 г. 7:23
-
Помечено в качестве ответа
-
Сначала, нужно точно определить, что за ошибка. Not Found — значит, что произошла ошибка сервера и за ней может скрываться все, что угодно.
Для того, чтобы точно определить ошибку, попробуйте использоваться Fiddler2.
Также можете добавить сл. строки в web.config — этим Вы включите трасировку WCF и сможете узнать, какая на самом деле ошибка произошла по логам сервиса (в папке c:\temp\).
<system.diagnostics> <sources> <source name="System.ServiceModel" switchValue="Verbose,ActivityTracing" propagateActivity="true"> <listeners> <add type="System.Diagnostics.XmlWriterTraceListener" name="ServiceModel" initializeData="c:\temp\server.svclog"> <filter type="" /> </add> </listeners> </source> </sources> <trace autoflush="true" /> </system.diagnostics>
-
Помечено в качестве ответа
Abolmasov DmitryModerator
29 июня 2012 г. 7:23
-
Помечено в качестве ответа
Я написал приложение, которое отлично работало в течение нескольких месяцев, в последние несколько дней я получал ошибку ниже только в установленной версии.
Если я запускаю исходный код в 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
// using System.IO; using System.Xml.Linq; using System.Net; using System.Web; namespace rsh { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { button1.PerformClick(); } private void button1_Click(object sender, EventArgs e) { string[] st = richTextBox1.Lines; string langTo = "ru"; // Я зык на который нужно перевести Test1(st, langTo); } public void Test1(string[] args, string langTo) // static void Test1(string[] args, string langTo) { try { // инфо сообщение // string languagesForTranslate = "албанский sq,\nанглийский en,\nарабский ar,\nармянский hy,\nазербайджанский az,\nафрикаанс af,\nбаскский eu,\nбелорусский be,\nболгарский bg,\nбоснийский bs,\nваллийский cy,\nвьетнамский vi,\nвенгерский hu,\nгаитянский(креольский) ht,\nгалисийский gl,\nголландский nl,\nгреческий el,\nгрузинский ka,\nдатский da,\nиврит he,\nиндонезийский id,\nирландский ga,\nитальянский it,\nиспанский es,\nказахский kk,\nкаталанский ca,\nкиргизский ky,\nкитайский zh,\nкорейский ko,\nлатынь la,\nлатышский lv,\nлитовский lt,\nмалагасийский mg,\nмалайский ms,\nмальтийский mt,\nмакедонский mk,\nмонгольский mn,\nнемецкий de,\nнорвежский no,\nперсидский fa,\nпольский pl,\nпортугальский pt,\nрумынский ro,\nрусский ru,\nсербский sr,\nсловацкий sk,\nсловенский sl,\nсуахили sw,\nтаджикский tg,\nтайский th,\nтагальский tl,\nтатарский tt,\nтурецкий tr,\nузбекский uz,\nукраинский uk,\nфинский fi,\nфранцузский fr,\nхорватский hr,\nчешский cs,\nшведский sv,\nэстонский et,\nяпонский ja"; // Console.WriteLine("Перечень языков перевода\n\n" + languagesForTranslate + "\n"); // string text = File.ReadAllText(args[0]); string text = args[0]; TextTranslationAPI api = new TextTranslationAPI(); TranslateCommand languageOfText = new TranslateCommand { Type = RequestType.Detect, Parameters = new Dictionary<string, string> { { "text", text } }, ResultSelector = x => x.Attribute("lang").Value }; string languageFrom = api.GetResult(languageOfText); //Console.WriteLine("Язык текста для перевода " + languageFrom + "\n"); //Console.WriteLine("Выберите из перечня языков, язык на который будет переводится текст в вашем файле:\n"); //Console.WriteLine("Пример: -en\n"); // string languageTo = Console.ReadLine(); // ИСХ string languageTo = langTo; string translateLanguage = languageFrom + languageTo; TranslateCommand translate = new TranslateCommand { Type = RequestType.Translate, Parameters = new Dictionary<string, string> { { "lang", translateLanguage }, { "text", text } }, ResultSelector = x => x.Element("text").Value }; string result = api.GetResult(translate); richTextBox2.Text = result; string adresOutPutFile = string.Format(@"C:\Temp\{0}.txt", translateLanguage); File.WriteAllText(adresOutPutFile, result); } catch (Exception ex) { richTextBox3.Text += ex.ToString(); richTextBox3.Text += "ОШИБКА, НЕВЕРНО ВВЕЛИ ЯЗЫК НА КОТОРЫЙ БУДЕТ ПЕРЕВОДИТСЯ ТЕКСТ В ВАШЕМ ФАЙЛЕ: " + ex.Message; // Console.WriteLine("ОШИБКА, НЕВЕРНО ВВЕЛИ ЯЗЫК НА КОТОРЫЙ БУДЕТ ПЕРЕВОДИТСЯ ТЕКСТ В ВАШЕМ ФАЙЛЕ: " + ex.Message); } } enum RequestType { Translate, Detect } struct TranslateCommand { public RequestType Type; public Dictionary<string, string> Parameters; public Func<XElement, string> ResultSelector; } class TextTranslationAPI { private readonly string Url; private readonly string Key; public TextTranslationAPI(string url, string key) { Url = url; Key = key; } public TextTranslationAPI() : this(@"https://translate.yandex.net/api/v1.5/tr/translate/", "trnsl.1.1.20180930T111308Z.5e8e8b704ad292c9.f7780e2f1ef62bd0d0301cae74e677ef8a62be7a") { } private string GetAction(RequestType type) { switch (type) { case RequestType.Detect: return "detect"; case RequestType.Translate: return "translate"; default: throw new ArgumentOutOfRangeException(); } } public string GetResult(TranslateCommand command) { string strUrl = Url + GetAction(command.Type) + "?key=" + Key; foreach (var parameter in command.Parameters) strUrl += "&" + parameter.Key + "=" + HttpUtility.UrlEncode(parameter.Value); WebClient webClitnt = new WebClient(); webClitnt.Encoding = Encoding.UTF8; string stringXml = webClitnt.DownloadString(strUrl); // ОШИБКА XDocument document = XDocument.Parse(stringXml); string textTranslate = command.ResultSelector(document.Root); return textTranslate; } } } } |