我已经编写了一个可以运行数月的应用程序,在过去的几天里我只在安装的版本上收到了以下错误。
如果我在VS中运行源代码,一切正常。此外,bin文件夹中的.exe工作正常。它只是生成错误的已安装版本,如果我重新编译并重新安装,我会得到同样的错误。
我有点难过是什么导致了这一点,并希望有一些指示。它似乎是通过IE的WebRequest响应没有返回,但我很难过为什么它在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
编辑:
这是作为独立应用程序安装的。当我以管理员身份运行时,我打开了程序文件夹并以管理员身份运行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
}
答案 0 :(得分:16)
看起来问题是基于服务器端的。
在我的情况下,我使用的是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]";
答案 1 :(得分:15)
添加以下行:
request.UseDefaultCredentials = true;
这将允许应用程序使用登录用户的凭据来访问该站点。如果它返回403,显然它需要进行身份验证。
您(现在?)也可能在您和远程站点之间拥有身份验证代理。在这种情况下,请尝试:
request.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
希望这有帮助。
答案 2 :(得分:2)
它的权限错误。您的VS可能使用提升的帐户或不同的用户帐户运行,而不是使用已安装版本的用户。
检查IIS权限并查看哪些帐户可以访问您正在访问的资源可能很有用。与您使用的帐户以及已安装的版本正在使用的帐户交叉引用。
答案 3 :(得分:0)
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();
}
答案 4 :(得分:0)
这可能不会帮助太多人,但这是我的情况:我正在使用Jira Rest Api并使用我的个人凭据(我用来登录Jira的凭据)。我更新了我的Jira密码,但忘了在我的代码中更新它们。我收到403错误,我尝试在代码中更新我的密码,但仍然收到错误。
解决方案:我尝试登录Jira(从他们的登录页面),我必须输入文本以证明我不是机器人。之后,我再次尝试从代码中运行。外卖:服务器可能已将您锁定。
答案 5 :(得分:0)
在我的情况下,我记得前一段时间为这个地址创建了防火墙漏洞,所以我不得不设置useDefaultWebProxy =&#34; false&#34;在配置文件中的绑定上,如果没有指定useDefaultWebProxy,则默认使用代理。
答案 6 :(得分:0)
环境:
request.Referer = @"http://www.somesite.com/";
并添加cookies
而不是为我工作
答案 7 :(得分:0)
我们应该使用证书中提供的名称访问网站。{{3}}
答案 8 :(得分:0)
在我的情况下,我不得不在循环中重复调用API,这导致我的系统停止返回403 Forbidden Error
。由于我的API提供程序不允许毫秒内来自同一客户端的多个请求,因此我不得不至少使用1秒的延迟:
foreach (var it in list)
{
Thread.Sleep(1000);
// Call API
}
答案 9 :(得分:0)
就我而言,我必须同时添加“用户代理”和“默认凭据= True”。我知道这已经很老了,仍然想分享。希望这可以帮助。下面的代码在powershell中,但是它应该对使用c#的其他人有所帮助。
<div v-for="(item, index) in placeText" :key="index" class="message-send-body">
<div class="msg" >
{{item.post}}
</div>
</div>