2016-07-26 22 views
9

Próbowałem ustawić wartość czegoś z PCL, gdy zdałem sobie sprawę, że go brakuje. Oto jak wygląda moja klasa HttpWebRequest:Dlaczego brakuje właściwości UserAgent w mojej klasie HttpWebRequest?

#region Assembly System.Net.Requests, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.5\Profile\Profile111\System.Net.Requests.dll 
#endregion 

using System.IO; 

namespace System.Net 
{ 
    // 
    // Summary: 
    //  Provides an HTTP-specific implementation of the System.Net.WebRequest class. 
    public class HttpWebRequest : WebRequest 
    { 
     // 
     // Summary: 
     //  Gets or sets the value of the Accept HTTP header. 
     // 
     // Returns: 
     //  The value of the Accept HTTP header. The default value is null. 
     public string Accept { get; set; } 
     // 
     // Summary: 
     //  Gets or sets a value that indicates whether to buffer the received from the Internet 
     //  resource. 
     // 
     // Returns: 
     //  Returns System.Boolean.true to enable buffering of the data received from the 
     //  Internet resource; false to disable buffering. The default is true. 
     public virtual bool AllowReadStreamBuffering { get; set; } 
     public override string ContentType { get; set; } 
     // 
     // Summary: 
     //  Gets or sets a timeout, in milliseconds, to wait until the 100-Continue is received 
     //  from the server. 
     // 
     // Returns: 
     //  Returns System.Int32.The timeout, in milliseconds, to wait until the 100-Continue 
     //  is received. 
     public int ContinueTimeout { get; set; } 
     // 
     // Summary: 
     //  Gets or sets the cookies associated with the request. 
     // 
     // Returns: 
     //  A System.Net.CookieContainer that contains the cookies associated with this request. 
     public virtual CookieContainer CookieContainer { get; set; } 
     // 
     // Summary: 
     //  Gets or sets authentication information for the request. 
     // 
     // Returns: 
     //  An System.Net.ICredentials that contains the authentication credentials associated 
     //  with the request. The default is null. 
     public override ICredentials Credentials { get; set; } 
     // 
     // Summary: 
     //  Gets a value that indicates whether a response has been received from an Internet 
     //  resource. 
     // 
     // Returns: 
     //  true if a response has been received; otherwise, false. 
     public virtual bool HaveResponse { get; } 
     // 
     // Summary: 
     //  Specifies a collection of the name/value pairs that make up the HTTP headers. 
     // 
     // Returns: 
     //  A System.Net.WebHeaderCollection that contains the name/value pairs that make 
     //  up the headers for the HTTP request. 
     // 
     // Exceptions: 
     // T:System.InvalidOperationException: 
     //  The request has been started by calling the System.Net.HttpWebRequest.GetRequestStream, 
     //  System.Net.HttpWebRequest.BeginGetRequestStream(System.AsyncCallback,System.Object), 
     //  System.Net.HttpWebRequest.GetResponse, or System.Net.HttpWebRequest.BeginGetResponse(System.AsyncCallback,System.Object) 
     //  method. 
     public override WebHeaderCollection Headers { get; set; } 
     // 
     // Summary: 
     //  Gets or sets the method for the request. 
     // 
     // Returns: 
     //  The request method to use to contact the Internet resource. The default value 
     //  is GET. 
     // 
     // Exceptions: 
     // T:System.ArgumentException: 
     //  No method is supplied.-or- The method string contains invalid characters. 
     public override string Method { get; set; } 
     // 
     // Summary: 
     //  Gets the original Uniform Resource Identifier (URI) of the request. 
     // 
     // Returns: 
     //  A System.Uri that contains the URI of the Internet resource passed to the System.Net.WebRequest.Create(System.String) 
     //  method. 
     public override Uri RequestUri { get; } 
     // 
     // Summary: 
     //  Gets a value that indicates whether the request provides support for a System.Net.CookieContainer. 
     // 
     // Returns: 
     //  Returns System.Boolean.true if a System.Net.CookieContainer is supported; otherwise, 
     //  false. 
     public virtual bool SupportsCookieContainer { get; } 
     // 
     // Summary: 
     //  Gets or sets a System.Boolean value that controls whether default credentials 
     //  are sent with requests. 
     // 
     // Returns: 
     //  true if the default credentials are used; otherwise false. The default value 
     //  is false. 
     // 
     // Exceptions: 
     // T:System.InvalidOperationException: 
     //  You attempted to set this property after the request was sent. 
     public override bool UseDefaultCredentials { get; set; } 

     // 
     // Summary: 
     //  Cancels a request to an Internet resource. 
     public override void Abort(); 
     // 
     // Summary: 
     //  Begins an asynchronous request for a System.IO.Stream object to use to write 
     //  data. 
     // 
     // Parameters: 
     // callback: 
     //  The System.AsyncCallback delegate. 
     // 
     // state: 
     //  The state object for this request. 
     // 
     // Returns: 
     //  An System.IAsyncResult that references the asynchronous request. 
     // 
     // Exceptions: 
     // T:System.Net.ProtocolViolationException: 
     //  The System.Net.HttpWebRequest.Method property is GET or HEAD.-or- System.Net.HttpWebRequest.KeepAlive 
     //  is true, System.Net.HttpWebRequest.AllowWriteStreamBuffering is false, System.Net.HttpWebRequest.ContentLength 
     //  is -1, System.Net.HttpWebRequest.SendChunked is false, and System.Net.HttpWebRequest.Method 
     //  is POST or PUT. 
     // 
     // T:System.InvalidOperationException: 
     //  The stream is being used by a previous call to System.Net.HttpWebRequest.BeginGetRequestStream(System.AsyncCallback,System.Object)-or- 
     //  System.Net.HttpWebRequest.TransferEncoding is set to a value and System.Net.HttpWebRequest.SendChunked 
     //  is false.-or- The thread pool is running out of threads. 
     // 
     // T:System.NotSupportedException: 
     //  The request cache validator indicated that the response for this request can 
     //  be served from the cache; however, requests that write data must not use the 
     //  cache. This exception can occur if you are using a custom cache validator that 
     //  is incorrectly implemented. 
     // 
     // T:System.Net.WebException: 
     //  System.Net.HttpWebRequest.Abort was previously called. 
     // 
     // T:System.ObjectDisposedException: 
     //  In a .NET Compact Framework application, a request stream with zero content length 
     //  was not obtained and closed correctly. For more information about handling zero 
     //  content length requests, see Network Programming in the .NET Compact Framework. 
     public override IAsyncResult BeginGetRequestStream(AsyncCallback callback, object state); 
     // 
     // Summary: 
     //  Begins an asynchronous request to an Internet resource. 
     // 
     // Parameters: 
     // callback: 
     //  The System.AsyncCallback delegate 
     // 
     // state: 
     //  The state object for this request. 
     // 
     // Returns: 
     //  An System.IAsyncResult that references the asynchronous request for a response. 
     // 
     // Exceptions: 
     // T:System.InvalidOperationException: 
     //  The stream is already in use by a previous call to System.Net.HttpWebRequest.BeginGetResponse(System.AsyncCallback,System.Object)-or- 
     //  System.Net.HttpWebRequest.TransferEncoding is set to a value and System.Net.HttpWebRequest.SendChunked 
     //  is false.-or- The thread pool is running out of threads. 
     // 
     // T:System.Net.ProtocolViolationException: 
     //  System.Net.HttpWebRequest.Method is GET or HEAD, and either System.Net.HttpWebRequest.ContentLength 
     //  is greater than zero or System.Net.HttpWebRequest.SendChunked is true.-or- System.Net.HttpWebRequest.KeepAlive 
     //  is true, System.Net.HttpWebRequest.AllowWriteStreamBuffering is false, and either 
     //  System.Net.HttpWebRequest.ContentLength is -1, System.Net.HttpWebRequest.SendChunked 
     //  is false and System.Net.HttpWebRequest.Method is POST or PUT.-or- The System.Net.HttpWebRequest 
     //  has an entity body but the System.Net.HttpWebRequest.BeginGetResponse(System.AsyncCallback,System.Object) 
     //  method is called without calling the System.Net.HttpWebRequest.BeginGetRequestStream(System.AsyncCallback,System.Object) 
     //  method. -or- The System.Net.HttpWebRequest.ContentLength is greater than zero, 
     //  but the application does not write all of the promised data. 
     // 
     // T:System.Net.WebException: 
     //  System.Net.HttpWebRequest.Abort was previously called. 
     public override IAsyncResult BeginGetResponse(AsyncCallback callback, object state); 
     // 
     // Summary: 
     //  Ends an asynchronous request for a System.IO.Stream object to use to write data. 
     // 
     // Parameters: 
     // asyncResult: 
     //  The pending request for a stream. 
     // 
     // Returns: 
     //  A System.IO.Stream to use to write request data. 
     // 
     // Exceptions: 
     // T:System.ArgumentNullException: 
     //  asyncResult is null. 
     // 
     // T:System.IO.IOException: 
     //  The request did not complete, and no stream is available. 
     // 
     // T:System.ArgumentException: 
     //  asyncResult was not returned by the current instance from a call to System.Net.HttpWebRequest.BeginGetRequestStream(System.AsyncCallback,System.Object). 
     // 
     // T:System.InvalidOperationException: 
     //  This method was called previously using asyncResult. 
     // 
     // T:System.Net.WebException: 
     //  System.Net.HttpWebRequest.Abort was previously called.-or- An error occurred 
     //  while processing the request. 
     public override Stream EndGetRequestStream(IAsyncResult asyncResult); 
     // 
     // Summary: 
     //  Ends an asynchronous request to an Internet resource. 
     // 
     // Parameters: 
     // asyncResult: 
     //  The pending request for a response. 
     // 
     // Returns: 
     //  A System.Net.WebResponse that contains the response from the Internet resource. 
     // 
     // Exceptions: 
     // T:System.ArgumentNullException: 
     //  asyncResult is null. 
     // 
     // T:System.InvalidOperationException: 
     //  This method was called previously using asyncResult.-or- The System.Net.HttpWebRequest.ContentLength 
     //  property is greater than 0 but the data has not been written to the request stream. 
     // 
     // T:System.Net.WebException: 
     //  System.Net.HttpWebRequest.Abort was previously called.-or- An error occurred 
     //  while processing the request. 
     // 
     // T:System.ArgumentException: 
     //  asyncResult was not returned by the current instance from a call to System.Net.HttpWebRequest.BeginGetResponse(System.AsyncCallback,System.Object). 
     public override WebResponse EndGetResponse(IAsyncResult asyncResult); 
    } 
} 

Nie wiem nawet, jakie szczegóły dodać do pytania. Proszę, powiedz mi, żebym mógł.

Odpowiedz

12

według dokumentacji na MSDN o HttpWebRequest.UserAgent Property

to informacje o wersji

Version Information

  • Framework Dostępne od 1,1
  • Silverlight Dostępne od 5,0
  • Windows Phone Silverlight Dostępne od 7,0

Można zauważyć, że nie ma żadnej wzmianki o Portable Class Biblioteka (PCL), w przeciwieństwie do biblioteki z biblioteki HttpWebRequest Class Version Information

  • Uniwersalna platforma Windows Dostępne od 4,5
  • .NET Framework dostępny od 1,1
  • Biblioteka Obsługiwane w Portable Class: przenośne platformy .NET
  • Silverlight Avai label od 2.0
  • Windows Phone Silverlight Dostępne od 7.0
  • Windows Phone Dostępne od 8,1

więc wszystko to oznacza to, że dostęp do HttpWebRequest.UserAgent Property jest niedostępny w trybie PCL

Teraz chociaż jest HttpWebRequest.Headers Property dostępny w Portable Class Library, ty należy zwrócić uwagę na następujące uwagi od MSDN

Remarks

Kolekcja Nagłówki zawiera nagłówki protokołów związane z żądaniem z . Poniższa tabela zawiera listę nagłówków HTTP, które nie są przechowywane w kolekcji Headers, ale są ustawione przez system lub ustawione według właściwości lub metod.

Następnie dołączają do nagłówka User-Agent.

Metoda Dodaj zgłasza wyjątek ArgumentException, jeśli próbujesz ustawić jeden z tych chronionych nagłówków.
... Nie należy zakładać, że wartości nagłówka pozostaną niezmienione, ponieważ serwery sieci Web i pamięci podręczne mogą zmieniać lub dodawać nagłówki do żądania sieci Web .

Najprawdopodobniej jest on ustawiony przez system, na którym działa PCL.

Xamarin documentation pokazuje, że nieruchomość powinna istnieć, ale uważam, że ta informacja może być nieprawidłowa.

System.Net.HttpWebRequest.UserAgent Property 

Gets or sets the value of the User-agent HTTP header. 
Syntax 
public String UserAgent { get; set; } 
Value 

    A String containing the value of the HTTP User-agent header. The default value is null. 

Remarks 
Note: For additional information see section 14.43 of IETF RFC 2616 - HTTP/1.1. 
Requirements 
Namespace: System.Net 
Assembly: System (in System.dll) 
Assembly Versions: 1.0.5000.0, 2.0.0.0, 4.0.0.0 

Należy potwierdzić, że przenośne platformy docelowe Class Library, aby upewnić się, że nie ma żadnych konfliktów, które usuwają właściwość UserAgent.

PCL: Obsługiwane typy i członków

rodzajów i członkach, które są dostępne w przenośnych projektów Class Library są ograniczone przez kilka czynników Kompatybilność:

  • Muszą być współużytkowane przez cele ty wybrany.

  • Trzeba zachowywać się podobnie w tych celach.

  • Nie mogą być kandydatami do wycofania.

  • Muszą mieć sens w przenośnym środowisku, zwłaszcza gdy członkowie wspierający nie są przenośni.

Oto documentation from Xamarin

Aktualizacja

byłem w stanie wykorzystać HttpClient API ustawienie User-Agent i złożyć zamówienie Pobierz.

public async Task GetURL(string url) { 
    var handler = new HttpClientHandler(); 
    var httpClient = new HttpClient(handler); 
    httpClient.DefaultRequestHeaders.Add("User-Agent", "My Custom User Agent"); 
    var request = new HttpRequestMessage(HttpMethod.Get, url); 
    var response = await httpClient.SendAsync(request); 
    //...other code removed for brevity 
} 
+0

Jestem zdezorientowany, co powinienem zrobić, aby skorzystać z tego pola? – nicks

+0

Proszę pomóc mi rozwiązać problem – nicks

+0

moich celów PCL: .NET Framework 4.5, ASP.NET Core 1.0, Windows 8, Windows Phone 8.1, Xamarin.Android, Xamarin.iOS, Xamarin.iOS (Classic) – nicks

6

Nie jest dla mnie jasne, czy próbujesz go dodać, czy pobrać, więc zaktualizuję odpowiedź po określeniu, co robisz.

Agent użytkownika zostanie uwzględniony w nagłówku HTTP. Klasa, do której należysz, ma właściwość o nazwie Headers, która powinna zostać znaleziona/ustawiona.

Aby dodać: Typ WebHeaderCollection ma indeksator ciągów, który pobiera pole nagłówka jako klucz. Powinieneś być w stanie go dodać lub pobrać.

request.Headers["User-Agent"] = "your user agent string"; 

Do pobrania możesz użyć indeksera strun.

var userAgent = request.Headers["User-Agent"]; 

Tutaj można znaleźć kod źródłowy dla typu WebHeaderCollection

+0

Próbuję ustawić. ustawienie go w kolekcji 'Headers' powoduje pojawienie się błędu, który mówi, że to pole powinno zostać zmodyfikowane poprzez odpowiednią właściwość. – nicks

+2

@NikaGamkrelidze - Spójrz na odpowiedź, którą opublikował Nikosi. Chociaż na pierwszy rzut oka wydawało mi się, że jest możliwe, że nie można ustawić 'User-Agent' za pomocą' HttpWebRequest', należy zamiast tego użyć 'HttpClient'. Nikosi ma również świetne wyjaśnienie, dlaczego. – Igor