GVKun编程网logo

c# – ‘System.Net.HttpWebRequest’不包含’GetRequestStream’的定义(c#不包含contains)

34

在本文中,我们将详细介绍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)

c# – ‘System.Net.HttpWebRequest’不包含’GetRequestStream’的定义(c#不包含contains)

我是C#和 Windows手机的新手,我试图制作一个执行 JSON请求的小应用程序.我在这个帖子 https://stackoverflow.com/a/4988809/702638中跟着这个例子

我当前的代码是:

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包.

解决方法

HttpWebRequest在WP8中没有GetRequestStream或GetRequestStreamAsync.你最好的打算是创建一个任务并等待它,像这样:
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方法

.net 4.0 以下HttpWebRequest Header 修改hosts方法

.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;
View Code

 

.Net HttpWebRequest.GetResponse() 在返回 http 状态代码 400(错误请求)时引发异常

.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 – HttpWebRequest 64位Windows上的GetResponse延迟

我最近尝试在64位版本的Windows上运行.NET应用程序,并惊讶地发现我所有的HttpWebRequest.GetResponse()对本地网络上的Web服务的调用都在谈论巨大(约500ms)的时间来完成.以下是有关我的测试设置的几个信息:

> .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之间的区别

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之间的区别等相关知识的信息别忘了在本站进行查找喔。

本文标签: