web-dev-qa-db-ja.com

C#でWebClientから応答ヘッダーを読み取る

私は最初のWindowsクライアントを作成しようとしています(これは私の最初の投稿です)、「Webサービス」と通信する必要がありますが、戻ってくる応答ヘッダーを読み取るのに問題があります。私の応答文字列では、Nice JSONドキュメントが返されましたか(これが私の次の問題です)、応答のヘッダーを「表示/読み取り」できません。本文のみです。

以下は私が使っているコードです。

        WebClient MyClient = new WebClient();
        MyClient.Headers.Add("Content-Type", "application/json");
        MyClient.Headers.Add("User-Agent", "DIMS /0.1 +http://www.xxx.dk");
        var urlstring = "http://api.xxx.com/users/" + Username.Text;
        string response = MyClient.DownloadString(urlstring.ToString());
12
user3352795

次のようにWebClient.ResponseHeadersを使用できます。

// Obtain the WebHeaderCollection instance containing the header name/value pair from the response.
WebHeaderCollection myWebHeaderCollection = myWebClient.ResponseHeaders;

Console.WriteLine("\nDisplaying the response headers\n");
// Loop through the ResponseHeaders and display the header name/value pairs. 
for (int i=0; i < myWebHeaderCollection.Count; i++)             
    Console.WriteLine ("\t" + myWebHeaderCollection.GetKey(i) + " = " + myWebHeaderCollection.Get(i));

から https://msdn.Microsoft.com/en-us/library/system.net.webclient.responseheaders(v = vs.110).aspx

22
RMazitov

完全な応答を表示する場合は、WebRequestではなくWebResponse/WebClientを使用することをお勧めします。これはより低レベルのAPIです。WebClientは、非常に単純なタスク(応答の本文を文字列としてダウンロードするなど)を単純にすることを目的としています。

(または.NET 4.5では HttpClient を使用できます。)

5
Jon Skeet

これは@ Jon Skeetが話していたWebRequest/WebResponseの使用方法の例です。

var urlstring = "http://api.xxx.com/users/" + Username.Text;
var MyClient = WebRequest.Create(urlstring) as HttpWebRequest;
//Assuming your using http get.  If not, you'll have to do a bit more work.
MyClient.Method = WebRequestMethods.Http.Get;
MyClient.Headers.Add(HttpRequestHeader.ContentType, "application/json");
MyClient.Headers.Add(HttpRequestHeader.UserAgent, "DIMS /0.1 +http://www.xxx.dk");
var response = MyClient.GetResponse() as HttpWebResponse;

for (int i = 0; i < response.Headers.Count; i++ )
     Console.WriteLine(response.Headers.GetKey(i) + " -- " + response.Headers.Get(i).ToString());

また、httpロジックを独自のオブジェクトに抽象化し、url、UserAgent、およびContentTypeを渡すことをお勧めします。

5
null_pointer

上記のMSDNの例と組み合わせたWebClient()を使用した簡単な方法(MSDNの例では、要求を開始する方法を明示的に説明していません)。 Properties.Settings.Default.XXXX値と混同しないでください。これらは、App.settingsファイルから読み取られた単なる文字列変数です。それが役に立てば幸いです:

using (var client = new WebClient()){
    try{
        var webAddr = Properties.Settings.Default.ServerEndpoint;
        Console.WriteLine("Sending to WebService " + webAddr);

        //This only applies if the URL access is secured with HTTP authentication
        if (Properties.Settings.Default.SecuredBy401Challenge)
             client.Credentials = new NetworkCredential(Properties.Settings.Default.UserFor401Challenge, Properties.Settings.Default.PasswordFor401Challenge);

        client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
        client.OpenRead(webAddr);

        // Obtain the WebHeaderCollection instance containing the header name/value pair from the response.
        WebHeaderCollection myWebHeaderCollection = client.ResponseHeaders;
        Console.WriteLine("\nDisplaying the response headers\n");

        // Loop through the ResponseHeaders and display the header name/value pairs.
        for (int i = 0; i < myWebHeaderCollection.Count; i++)
            Console.WriteLine("\t" + myWebHeaderCollection.GetKey(i) + " = " + myWebHeaderCollection.Get(i));
    }
    catch (Exception exc){
        Console.WriteLine( exc.Message);
    }
}
3
fRENCHfRIES64

これも機能します

string acceptEncoding = client.ResponseHeaders["Accept"].ToString();
3
Tim Davis

以下のコードはMSDNドキュメントに非常に似ていますが、Headersの代わりにResponseHeadersを使用し、MSDNコードの実行時に受け取ったnull参照例外を受け取りませんでした。 https://msdn.Microsoft.com/en-us/library/system.net.webclient.responseheaders(v = vs.110).aspx

        WebClient MyClient = new WebClient();
        MyClient.Headers.Add("Content-Type", "application/json");
        MyClient.Headers.Add("User-Agent", "DIMS /0.1 +http://www.xxx.dk");

        WebHeaderCollection myWebHeaderCollection = MyClient.Headers;
        for (int i = 0; i < myWebHeaderCollection.Count; i++)
        {
            Console.WriteLine("\t" + myWebHeaderCollection.GetKey(i) + " = " + myWebHeaderCollection.Get(i));
        }
0