0

私は次のような状況にあります。特定のサーバーにログインするためにいくつかのWebAPIを呼び出しています。呼び出しは次のようになります。webhost/login?username = email @ domain.com&password=alin戻り値は常に次のようなxmlです。

<response>
 <error>invalid user</error>
</response>

また

<response>
 <token>XXXXXXX</token>
</response>

したがって、間違ったクレデンシャルでこのAPIを呼び出すと、ページは401 httpステータスで戻り、この行に戻ります

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

エラーが発生し、catchブロックにジャンプします。(もちろん)次の行

stream = response.GetResponseStream();

決して起こらないので、返されたxmlを、その中のエラーメッセージを含めて読むことは決してありません。それでも、ブラウザにリンクを貼り付けるだけで、ページとxmlが読み込まれます

ブラウザがxmlをロードし、応答コンポーネントがロードしないのはなぜですか。ちなみに、私はこれをC#で行っています

ありがとう

Stream stream = null;
try 
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(finalURL);
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    stream = response.GetResponseStream();
}  
catch(Exception ex)
{
    string x = ex.Message;
}
4

3 に答える 3

3

さて、あなたは応答を見ようとしているのではありません。

特定の例外をキャッチした場合(当然のことながら、キャッチするExceptionことはほとんどの場合悪い考えです)、応答データを取得できます。

catch (WebException e)
{
    WebResponse response = e.Response;
    // TODO: Check whether the status code is one you can handle
    // Get the data from here...
}

using障害が発生していない状態でもステートメントを作成する必要があることに注意してくださいHttpWebResponse。そうしないと、リソースが開いたままになってしまいます。

于 2012-07-27T10:17:09.080 に答える
0

これを試して:

if (ex is WebException)
{
    var webException = ex as WebException;
    var response = (HttpWebResponse)webException.Response;

    switch (response.StatusCode)
     {
           case HttpStatusCode.Unauthorized:

               var responseStream = response.GetResponseStream();
              break;

       }  
} 
于 2012-07-27T10:17:00.037 に答える
0

ブラウザのユーザーエージェント文字列を見つけて、WebRequestのユーザーエージェント文字列を一致するように設定します。多くのサイトは、UAに基づいたバリアントコンテンツ/マークアップ/スタイル/スクリプトを提供しています。

の場合HttpWebRequest、UserAgentプロパティでUAを設定できます。

これが役立つかどうかを確認してください。

于 2012-07-27T10:18:28.707 に答える