1. ホーム
  2. c#

[解決済み】リモートサーバーがエラーを返しました。(403) Forbidden

2022-01-27 21:21:20

質問

数ヶ月間問題なく動作していたアプリを書いたのですが、ここ数日、インストールしたバージョンに限って以下のようなエラーが発生するようになりました。

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

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;

お役に立てれば幸いです。