1. ホーム
  2. c#

[解決済み] WebException (ステータス: プロトコルエラー)

2022-01-29 16:38:08

質問

C# で URL を呼び出すには WebClient クラスがあります。以下はそのコードです。-

    public string SendWebRequest(string requestUrl)
    {
        using (var client = new WebClient())
        {
            string responseText = client.DownloadString(requestUrl);
            return responseText;
        } 
    }

このコードは以下のExceptionの詳細で失敗します。

System.Net.WebException: The remote server returned an error: (1201).
   at System.Net.WebClient.DownloadDataInternal(Uri address, WebRequest& request)
   at System.Net.WebClient.DownloadString(Uri address)
   at System.Net.WebClient.DownloadString(String address)

Exception Status: ProtocolError

URLが正しくサーバーにヒットしました。サーバーで期待される動作(データベースの更新)が正しく行われる。サーバーが正しくレスポンスを送信している WebClient が応答処理をしていない。

また HttpWebRequest クラスがありますが、成功しませんでした。

当初は、リクエスト時に同様の問題がありました。を修正したところ、解決しました。 app.config を以下のように変更しました。-

    <settings>
        <httpWebRequest useUnsafeHeaderParsing = "true"/>
    </settings>

このフォーラムにURLを貼ることができないし、とにかくネットワーク外からアクセスできない。

同じURLをブラウザのアドレスバーにコピーすると、正常に動作し、期待通りの応答が返されます。

では、Windowsアプリケーションの問題とは何でしょうか?

編集1

回答からの提案を実装しました。また、受け入れた回答で提案された この という質問があります。現在、私の関数は次のようになっています。-

    public string SendWebRequest(string requestUrl)
    {
        using (var client = new WebClient())
        {
            client.Headers.Add("Accept", "text/plain");
            client.Headers.Add("Accept-Language", "en-US");
            client.Headers.Add("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)");
            client.Headers["Content-Type"] = "text/plain;charset=UTF-8";
            string responseText = client.DownloadString(requestUrl);
            return responseText;
        } 
    }

それでも問題は解決しません。レスポンスは、"Success"の代わりに空白文字列("")になっています。これは、サーバーの障害ではないことが確認されています。

での設定を削除すると app.config を実行すると、別の例外がスローされます。

System.Net.WebException: The server committed a protocol violation. Section=ResponseStatusLine
   at System.Net.WebClient.DownloadDataInternal(Uri address, WebRequest& request)
   at System.Net.WebClient.DownloadString(Uri address)
   at System.Net.WebClient.DownloadString(String address)

解決方法は?

サーバーから HTTP 1201 であり、これは 標準ステータスコード .

WebClient は、成功しないステータスコード (あなたの場合は認識できないステータスコード) に直面すると、例外を発生して失敗します。

を使用することをお勧めします。 HttpClient クラスを使用することができます。

public async Task<string> SendWebRequest(string requestUrl)
{
    using (HttpClient client = new HttpClient())
    using (HttpResponseMessage response = await client.GetAsync(requestUrl))
         return await response.Content.ReadAsStringAsync();
}

どうしても同期でやりたい場合

public string SendWebRequest(string requestUrl)
{
    using (HttpClient client = new HttpClient())
    using (HttpResponseMessage response = client.GetAsync(requestUrl).GetAwaiter().GetResult())
         return response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
}