c# – 为什么我的HttpWebRequest类中缺少UserAgent属性?
当我意识到它丢失时,我试图将该值从PCL设置为一个值.这是我的HttpWebRequest类的样子:
#region Assembly System.Net.Requests,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a // C:Program Files (x86)Reference AssembliesMicrosoftFramework.NETPortablev4.5ProfileProfile111System.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,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,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); } } 我甚至不知道添加什么细节的问题.请告诉我,我可以. 解决方法
根据MSDN上的文档约
HttpWebRequest.UserAgent Property
这是版本信息 Version Information > .NET Framework 你会注意到没有提到与HttpWebRequest Class不同的便携式类库(PCL) Version Information >通用Windows平台 所以这就意味着在PCL中不能访问HttpWebRequest.UserAgent Property 现在虽然有可移植类库中有HttpWebRequest.Headers Property,但您应该注意到MSDN中的以下注释 Remarks
然后他们继续在该列表中包含User-Agent头.
很可能它是由PCL执行的系统设置的. Xamarin documentation显示该物业应该存在,但我相信这些信息可能不正确. 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 您应该确认便携式类库定位的平台,以确保不会删除UserAgent属性的冲突. PCL:支持的类型和成员 便携式类库项目中提供的类型和成员受几个兼容性因素限制: >他们必须在您选择的目标对象之间共享. 这是一些documentation from Xamarin 更新 我可以使用 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 } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |