Настройка заголовка User-Agent для запроса WebClient

Каков правильный способ установки заголовка User-Agent для запроса WebClient для Windows Phone 7? Я нашел 2 варианта, но не уверен, какой из них правильный. Рассмотрение объекта WebClient:

WebClient client = new WebClient();

Я увидел 2 варианта:

  • установите User-Agent, используя:

    client.Headers["User-Agent"] = "myUserAgentString";
    
  • установите User-Agent с помощью WebHeaderCollection:

    WebHeaderCollection headers = new WebHeaderCollection();
    headers[HttpRequestHeader.UserAgent] = "userAgentString";
    client.Headers = headers;
    

Можете ли вы сообщить, какой из двух вышеперечисленных методов является правильным?

Ответ 1

вы можете пойти здесь (msdn), чтобы показать образец "правильный" для добавления пользовательского агента в ваш WebClient для С# и Здесь (msdn) для показа образца для телефона Windows.

вот этот пример для С#:

WebClient client = new WebClient ();

// Add a user agent header in case the 
// requested URI contains a query.

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

это образец для Windows Phone (silverlight):

request.Headers["UserAgent"]= "appname";

или

request.UserAgent = "appname";

Ответ 2

Я обнаружил, что WebClient продолжал удалять заголовок User-Agent после одного запроса, и я устал настраивать его каждый раз. Я использовал хак для установки User-Agent навсегда, создав собственный пользовательский WebClient и переопределяя метод GetWebRequest. Надеюсь это поможет.

public class CustomWebClient : WebClient
{
    public CustomWebClient(){}

    protected override WebRequest GetWebRequest(Uri address)
    {
        var request = base.GetWebRequest(address) as HttpWebRequest;
        request.UserAgent="Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/6.0;)";

        //... your other custom code...

        return request;
    }
}

Ответ 3

В качестве дополнения к другим ответам, вот руководство Microsoft для строки пользовательского агента для своих браузеров. Строки пользовательского агента отличаются браузером (Internet Explorer и Edge) и операционной системой (Windows 7, 8, 10 и Windows Phone).

Например, вот строка пользовательского агента для Internet Explorer 11 в Windows 10:

Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko 

и для Internet Explorer для Windows Phone 8.1 Update:

Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 520) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537

Шаблоны задаются для строк пользовательского агента для браузера Edge для настольных компьютеров, мобильных устройств и WebView. См. этот ответ для некоторых примеров строк интерфейса пользователя Edge.

Наконец, другая страница в MSDN содержит рекомендации для IE11 в старых настольных операционных системах.

IE11 в Windows 8.1:

Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko

и IE11 в Windows 7:

Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko

Ответ 4

Вы также можете использовать это:

client.Headers.Add(HttpRequestHeader.UserAgent, "My app.");

Ответ 5

const string ua = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)";
Request.Headers["User-Agent"] = ua;
var httpWorkerRequestField = Request.GetType().GetField("_wr", BindingFlags.Instance | BindingFlags.NonPublic);
if (httpWorkerRequestField != null)
{
    var httpWorkerRequest = httpWorkerRequestField.GetValue(Request);
    var knownRequestHeadersField = httpWorkerRequest.GetType().GetField("_knownRequestHeaders", BindingFlags.Instance | BindingFlags.NonPublic);
    if (knownRequestHeadersField != null)
    {
        string[] knownRequestHeaders = (string[])knownRequestHeadersField.GetValue(httpWorkerRequest);
                    knownRequestHeaders[39] = ua;
    }
}