在本文中,我们将详细介绍c#–‘System.Net.HttpWebRequest’不包含’GetRequestStream’的定义的各个方面,并为您提供关于c#不包含contains的相关解答,同时
在本文中,我们将详细介绍c# – ‘System.Net.HttpWebRequest’不包含’GetRequestStream’的定义的各个方面,并为您提供关于c#不包含contains的相关解答,同时,我们也将为您带来关于.net 4.0 以下HttpWebRequest Header 修改hosts方法、.Net HttpWebRequest.GetResponse() 在返回 http 状态代码 400(错误请求)时引发异常、.net – HttpWebRequest 64位Windows上的GetResponse延迟、asp.net – HttpRequest,HttpWebRequest和WebRequest之间的区别的有用知识。
本文目录一览:- c# – ‘System.Net.HttpWebRequest’不包含’GetRequestStream’的定义(c#不包含contains)
- .net 4.0 以下HttpWebRequest Header 修改hosts方法
- .Net HttpWebRequest.GetResponse() 在返回 http 状态代码 400(错误请求)时引发异常
- .net – HttpWebRequest 64位Windows上的GetResponse延迟
- asp.net – HttpRequest,HttpWebRequest和WebRequest之间的区别
c# – ‘System.Net.HttpWebRequest’不包含’GetRequestStream’的定义(c#不包含contains)
我当前的代码是:
public string login() { var httpWebRequest = (HttpWebRequest)WebRequest.Create(MY_URL); httpWebRequest.ContentType = "text/plain"; httpWebRequest.Method = "POST"; using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) { string text = MY_JSON_STRING; streamWriter.Write(text); } }
但由于某种原因Visual Studio正在标记GetRequestStream()并显示一条错误消息:
error CS1061: ‘System.Net.HttpWebRequest’ does not contain a
deFinition for ‘GetRequestStream’ and no extension method
‘GetRequestStream’ accepting a first argument of type
‘System.Net.HttpWebRequest’ Could be found (are you missing a using
directive or an assembly reference?)
有什么想法为什么会发生这种情况?我已经导入了System.Net包.
解决方法
using (var stream = await Task.Factory.FromAsync<Stream>(request.BeginGetRequestStream,request.EndGetRequestStream,null)) { // ... }
编辑:正如您所提到的那样,您刚刚开始使用C#,您需要将登录方法异步到使用await关键字:
public async Task<string> LoginAsync() { // ... }
呼叫者在拨打电话时需要使用await关键字:
string result = await foo.LoginAsync();
这是一个很好的主题:http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx
.net 4.0 以下HttpWebRequest Header 修改hosts方法


1 public class CusteredHeaderCollection : WebHeaderCollection
2 {
3 public bool HostHeaderValueReplaced { get; private set; }
4
5 public string ClusterUrl { get; private set; }
6
7 public CusteredHeaderCollection(string commonClusterUrl) : base()
8 {
9 if (string.IsNullOrEmpty("commonClusterUrl"))
10 throw new ArgumentNullException("commonClusterUrl");
11
12 this.ClusterUrl = commonClusterUrl;
13 }
14
15 public override string ToString()
16 {
17 this["Host"] = this.ClusterUrl;
18 string tmp = base.ToString();
19 this.HostHeaderValueReplaced = true;
20
21 return tmp;
22 }
23
24 }
25
26 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
27
28 FieldInfo headersFieldInfo = request.GetType().GetField("_HttpRequestHeaders", System.Reflection.BindingFlags.NonPublic
29 | System.Reflection.BindingFlags.Instance
30 | System.Reflection.BindingFlags.GetField);
31
32 CusteredHeaderCollection WssHeaders = new CusteredHeaderCollection(sDomain);
33
34 headersFieldInfo.SetValue(request, WssHeaders);
35
36 request.Proxy = null;
.Net HttpWebRequest.GetResponse() 在返回 http 状态代码 400(错误请求)时引发异常
我的情况是,当我从服务器获取 HTTP 400 代码时,服务器告诉我我的请求出了什么问题是一种完全合法的方式(使用 HTTP 响应内容中的消息)
但是,当状态码为 400 时,.NET HttpWebRequest 会引发异常。
我该如何处理?对我来说,400 是完全合法的,而且很有帮助。HTTP 内容包含一些重要信息,但异常使我偏离了我的道路。
答案1
小编典典如果有某种方法可以关闭“抛出不成功的代码”,那就太好了,但是如果你捕捉到 WebException,你至少可以使用响应:
using System;using System.IO;using System.Web;using System.Net;public class Test{ static void Main() { WebRequest request = WebRequest.Create("http://csharpindepth.com/asd"); try { using (WebResponse response = request.GetResponse()) { Console.WriteLine("Won''t get here"); } } catch (WebException e) { using (WebResponse response = e.Response) { HttpWebResponse httpResponse = (HttpWebResponse) response; Console.WriteLine("Error code: {0}", httpResponse.StatusCode); using (Stream data = response.GetResponseStream()) using (var reader = new StreamReader(data)) { string text = reader.ReadToEnd(); Console.WriteLine(text); } } } }}
您可能希望将“即使不是成功代码也给我回复”位封装在单独的方法中。(如果没有响应,我建议你仍然抛出,例如,如果你无法连接。)
如果错误响应可能很大(这是不寻常的),您可能需要调整HttpWebRequest.DefaultMaximumErrorResponseLength
以确保获得整个错误。
.net – HttpWebRequest 64位Windows上的GetResponse延迟
> .NET 3.5
> Windows Vista Home Premium 32bit,Windows Vista Business 64bit和Windows Server 2008 64bit.
测试代码是MSDN’s article on HttpWebRequest.GetResponse
中描述的示例的稍微修改的版本.我执行的唯一修改只是一个循环,因此我可以使用10个consequtive调用和基本身份验证,因为我定位的Web服务需要身份验证:
using System; using System.Diagnostics; using System.Net; using System.Text; using System.IO; public class Program { // Specify the URL to receive the request. public static void Main (string[] args) { CredentialCache crCache = null; Stopwatch s = new Stopwatch(); for (int i = 0; i < 10; i++) { s.Reset(); s.Start(); HttpWebRequest request = (HttpWebRequest)WebRequest.Create (args[0]); // Set some reasonable limits on resources used by this request request.MaximumAutomaticRedirections = 4; request.MaximumResponseHeadersLength = 4; // Set credentials to use for this request. if (crCache == null) { crCache = new CredentialCache(); crCache.Add(new Uri(args[0]),"Basic",new NetworkCredential("user","password")); } request.Credentials = crCache; request.PreAuthenticate = true; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Console.WriteLine("Content length is {0}",response.ContentLength); Console.WriteLine("Content type is {0}",response.ContentType); // Get the stream associated with the response. Stream receiveStream = response.GetResponseStream(); // Pipes the stream to a higher level stream reader with the required encoding format. StreamReader readStream = new StreamReader(receiveStream,Encoding.UTF8); Console.WriteLine("Response stream received."); //Console.WriteLine (readStream.ReadToEnd ()); response.Close(); readStream.Close(); s.Stop(); Console.WriteLine("Request took: " + s.ElapsedMilliseconds); } } }
我编译了针对Windows Vista Home Premium的x86和64位Windows机器的x64.这三个机器与托管Web服务的机器连接在同一个网络交换机上.以下是我得到的结果:
> Windows Vista Home Premium 32bit,x86程序集:GetResponse()的第一次调用在大约150ms内完成,而所有连续的调用大概需要10ms.
> Windows Vista Business 64bit,Server 2008 64位,x86和x64程序集:第一次调用大约需要1000ms,而每个连续的调用在500ms内完成.如果我禁用HttpWebRequest.PreAuthenticate,每个GetResponse在1000ms内完成(这是非常合理的,因为在这种情况下,每个请求都会触发两个单独的HTTP请求,一个以非授权结尾,一个得到适当的响应).
有没有人有一个线索的原因,我得到这样长的GetResponse延迟64位版本的Windows?
编辑
有关问题的其他信息:
>当使用Firefox 3.5执行请求时,我测量了响应时间(通过firebug),并且所有机器的请求 – 响应延迟是相同的,即不会重现问题.
>我用Wireshark做了进一步的包分析,并得出以下结果:
32bit:tcp对话如下:
> host->服务器新的Web请求HTTP GET / HTTP / 1.1
> server->主机两个TCP段(〜5ms)
> host->服务器Tcp Ack(确认两个段)(〜10us delta)
> server->主机HTTP / 1.1 200 OK(〜800us delta)
> host->服务器新的Web请求HTTP GET / HTTP / 1.1&捎带TCP前一段的TCP ack(HTTP / 1.1 200 OK)(〜10ms delta)
64位:tcp对话如下:
> host->服务器新的Web请求HTTP GET / HTTP / 1.1
> server->主机两个TCP段(〜5ms delta,与32bit相同)
> host->服务器Tcp Ack(确认两个段)(〜10us delta,与32位相同)
> server->主机HTTP / 1.1 200 OK(〜800us delta,与32位相同)
> host->服务器TCP前一帧的TCP ack(HTTP / 1.1 200 OK)(!!! 96ms)
> host->服务器新的Web请求HTTP GET / HTTP / 1.1(!!! 309ms)
在64位机器上获得的500ms主要发生在最后两个步骤中.请注意,这绝对不是与TCP堆栈相关(因为一切都可以用firefox).我们在最后两个步骤中得到不同TCP Ack模式的原因(捎带在32位,而64位分开的TCP Ack帧)是64位情况下新的Web请求延迟了309 96ms(因此TCP堆栈输出一个单独的Ack框架,它不能等待应用程序层).
所以,它似乎是:
>问题是由完成Web请求和发出新请求之间的增量时间引起的.
>该问题与.NET Framework有关系? (绝对不是TCP相关).
>问题发生在从MSDN(MS不会错误吗?)的库存Microsoft代码.
任何线索?
64位系统延迟的原因是WebClient等待Windows返回代理值.
编写这样的代码来克服这个问题.
WebClient wc = New WebClient; wc.Proxy = null;
这将消除一些用户(包括我自己:)看到的延迟)
很高兴我终于可以回馈社区帮助我这么多:)
asp.net – HttpRequest,HttpWebRequest和WebRequest之间的区别
解决方法
WebRequest
是HttpWebRequest的抽象基类 – 您不能直接使用它。它是其他*请求类的基类(用于FTP,文件和其他类型的Web请求)。这些类都用于从Web获取资源(文件)。
还有一个WebClient
类 – 可能是使用所有用于从Internet检索资源的BCL类最简单的类。
另一方面,HttpRequest
表示ASP.NET应用程序中资源的请求 – 这是请求的服务器端。
主要的区别是HttpWebRequest是HTTP客户端,HttpRequest是在ASP.NET Web应用程序中使用的服务器端。
关于c# – ‘System.Net.HttpWebRequest’不包含’GetRequestStream’的定义和c#不包含contains的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于.net 4.0 以下HttpWebRequest Header 修改hosts方法、.Net HttpWebRequest.GetResponse() 在返回 http 状态代码 400(错误请求)时引发异常、.net – HttpWebRequest 64位Windows上的GetResponse延迟、asp.net – HttpRequest,HttpWebRequest和WebRequest之间的区别等相关知识的信息别忘了在本站进行查找喔。
本文标签: