Festlegen des User-Agent-Headers für eine WebClient-Anforderung

70

Wie kann der User-Agent-Header für eine WebClient-Anforderung für Windows Phone 7 richtig festgelegt werden? Ich habe 2 Optionen gefunden, bin mir aber nicht sicher, welche die richtige ist. Betrachten eines WebClient-Objekts:

WebClient client = new WebClient();

Ich habe 2 Optionen gesehen:

  1. Stellen Sie den User-Agent ein mit:

    client.Headers["User-Agent"] = "myUserAgentString";
    
  2. Legen Sie den User-Agent mithilfe der WebHeaderCollection fest:

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

Können Sie uns bitte mitteilen, welche der beiden oben genannten Methoden die richtige ist?

AndreiC
quelle

Antworten:

111

Sie können in der WebClientDokumentation nach einem C # -Beispiel suchen, das Ihrem Benutzer einen User-Agent hinzufügt, WebClientund hier nach einem Beispiel für Windows Phone.

Dies ist das Beispiel für C #:

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;)");

Dies ist ein Beispiel für Windows Phone (Silverlight):

request.Headers["UserAgent"] = "appname";
// OR
request.UserAgent = "appname";
Doc Roms
quelle
24

Ich stellte fest, dass der WebClient nach einer Anforderung meinen User-Agent-Header immer wieder entfernte, und ich war es leid, ihn jedes Mal festzulegen. Ich habe einen Hack verwendet, um den User-Agent dauerhaft festzulegen, indem ich meinen eigenen benutzerdefinierten WebClient erstellt und die GetWebRequest- Methode überschrieben habe . Hoffe das hilft.

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;
    }
}
Ambrose Leung
quelle
13

Sie können das auch verwenden:

client.Headers.Add(HttpRequestHeader.UserAgent, "My app.");
Theodore Tsirpanis
quelle
2

Als Ergänzung zu den anderen Antworten finden Sie hier die Anleitung von Microsoft für Benutzeragentenzeichenfolgen für die Browser. Die Zeichenfolgen des Benutzeragenten unterscheiden sich je nach Browser (Internet Explorer und Edge) und Betriebssystem (Windows 7, 8, 10 und Windows Phone).

Hier ist beispielsweise die Benutzeragentenzeichenfolge für Internet Explorer 11 unter Windows 10 :

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

und für Internet Explorer für 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

Es werden Vorlagen für die Benutzeragentenzeichenfolgen für den Edge- Browser für Desktop, Mobile und WebView angegeben. In dieser Antwort finden Sie einige Beispiele für Edge-Benutzeragentenzeichenfolgen.

Schließlich enthält eine weitere Seite zu MSDN Anleitungen für IE11 unter älteren Desktop-Betriebssystemen.

IE11 unter Windows 8.1 :

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

und IE11 unter Windows 7 :

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

Das hat bei mir funktioniert:

var message = new HttpRequestMessage(method, url);
message.Headers.TryAddWithoutValidation("user-agent", "<user agent header value>");
var client = new HttpClient();
var response = await client.SendAsync(message);

Hier finden Sie die Dokumentation zu TryAddWithoutValidation

Oscar Fraxedas
quelle
-2
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;
    }
}
Alabala
quelle
4
Nur Code ist keine Antwort. Können Sie erklären, was er tut und warum er verwendet werden sollte?
Jérémie Bertrand