如何使用AutoRedirect从C#HTTPWebRequest访问文件内容

如何使用AutoRedirect从C#HTTPWebRequest访问文件内容,c#,httpwebrequest,C#,Httpwebrequest,我正在尝试调用一个应该返回身份验证令牌的URL。 数据被发布到URL,并在多次重定向后返回带有标记的JSON对象。 我用的是C#和WPF 以下是我所做工作的摘录: HttpWebRequest request1 = (HttpWebRequest)WebRequest.Create(action); request1.Method = "POST"; StringBuilder sb = new StringBuilder

我正在尝试调用一个应该返回身份验证令牌的URL。 数据被发布到URL,并在多次重定向后返回带有标记的JSON对象。 我用的是C#和WPF

以下是我所做工作的摘录:

            HttpWebRequest request1 = (HttpWebRequest)WebRequest.Create(action);
            request1.Method = "POST";

            StringBuilder sb = new StringBuilder();
            String boundary = "-----------------------------1721856231228";
            foreach (elem in elems)
            {
                String nameStr = elem.GetAttribute("name");
                if (nameStr != null && nameStr.Length != 0)
                {
                    String valueStr = elem.GetAttribute("value");
                    sb.Append("\r\n" + boundary + "\r\n");
                    sb.Append("Content-Disposition: form-data; name=\"" + nameStr + "\"" + "\r\n");
                    sb.Append("\r\n");
                    sb.Append(valueStr);
                }
            }
            sb.Append("\r\n--" + boundary + "--" + "\r\n");
            String postData1 = sb.ToString();
            request1.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3";
            request1.UserAgent = "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36";
            request1.ContentType = "application/x-www-form-urlencoded; boundary=" + boundary;
            request1.ContentLength = postData1.Length;
            request1.KeepAlive = true;
            request1.AllowAutoRedirect = true;

            StreamWriter w = new StreamWriter(request1.GetRequestStream());
            w.Write(postData1);
            w.Close();

            HttpWebResponse response1 = (HttpWebResponse)request1.GetResponse();
            StreamReader reader1 = new StreamReader(response1.GetResponseStream());
            String responseText1 = reader1.ReadToEnd();
            reader1.Close();
            response1.Close();
但是响应不包含带有标记的JSON。 我正在使用Fiddler,可以在上面代码的末尾暂停,而应该包含JSON的URI还没有被调用。我可以继续在调试器中执行其他代码,然后稍后,Fiddler将显示已调用的URI,并且一个文件下载弹出窗口允许我下载包含令牌的JSON文件。 我不希望弹出窗口,我希望能够以编程方式捕获JSON数据

我发现,通过在上面代码的末尾添加以下行,并在调试器中执行该行,Fiddler将报告令牌URL已被调用(我可以在Fiddler中看到正确的JSON响应):

但我不知道如何访问此响应,或者如何使文件下载弹出窗口短路,以防不发生

也许KeepAlive设置中的某些内容会有所帮助?

尝试使用newtonsoft阅读 使用Newtonsoft.Json

TokenModel tokenModel;

StreamReader reader1 = new StreamReader(response1.GetResponseStream());
using (JsonTextReader reader = new JsonTextReader(reader1))
{    
 tokenModel = serializer.Deserialize<TokenModel>(reader);
}
TokenModel-TokenModel;
StreamReader reader1=新的StreamReader(response1.GetResponseStream());
使用(JsonTextReader reader=newjsontextreader(reader1))
{    
tokenModel=序列化程序。反序列化(读取器);
}
参考:

或者您可以使用以下完整的请求和HttpClient的响应

        var client = new HttpClient();
        client.BaseAddress = new Uri("your url");
        int _TimeoutSec = 90;
        client.Timeout = new TimeSpan(0, 0, _TimeoutSec);
        string _ContentType = "application/x-www-form-urlencoded";            
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(_ContentType));

       //if you have any content to send use following keyValuePair

        var kv = new List<KeyValuePair<string, string>>();
        kv.Add(new KeyValuePair<string, string>("key1", "value"));
        kv.Add(new KeyValuePair<string, string>("key2", "value"));


        var req = new HttpRequestMessage(System.Net.Http.HttpMethod.Post, "your url") { Content = new FormUrlEncodedContent(kv) };
        var responseAsyn = client.SendAsync(req);
        var response = responseAsyn.GetAwaiter().GetResult();

        TokenModel tokenResponse = new TokenModel();
        if (response.StatusCode == System.Net.HttpStatusCode.OK)
        {
            var responseString = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
            tokenResponse = JsonConvert.DeserializeObject<TokenModel>(responseString);
        }
var-client=new-HttpClient();
client.BaseAddress=新Uri(“您的url”);
int _TimeoutSec=90;
client.Timeout=新的时间跨度(0,0,_TimeoutSec);
字符串_ContentType=“application/x-www-form-urlencoded”;
client.DefaultRequestHeaders.Accept.Add(新MediaTypeWithQualityHeaderValue(_ContentType));
//如果您有任何要发送的内容,请使用以下keyValuePair
var kv=新列表();
增加(新的KeyValuePair(“key1”,“value”));
增加(新的KeyValuePair(“key2”,“value”));
var req=new-HttpRequestMessage(System.Net.Http.HttpMethod.Post,“您的url”){Content=new-FormUrlEncodedContent(kv)};
var responseAsyn=client.SendAsync(req);
var response=responseAsyn.GetAwaiter().GetResult();
TokenModel tokenResponse=新的TokenModel();
if(response.StatusCode==System.Net.HttpStatusCode.OK)
{
var responseString=response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
tokenResponse=JsonConvert.DeserializeObject(responseString);
}

我尝试了,但最终的URL和JSON响应仍然没有返回。我用HttpClient更新了完整的请求,这是任何返回JSON的post请求的工作代码
        var client = new HttpClient();
        client.BaseAddress = new Uri("your url");
        int _TimeoutSec = 90;
        client.Timeout = new TimeSpan(0, 0, _TimeoutSec);
        string _ContentType = "application/x-www-form-urlencoded";            
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(_ContentType));

       //if you have any content to send use following keyValuePair

        var kv = new List<KeyValuePair<string, string>>();
        kv.Add(new KeyValuePair<string, string>("key1", "value"));
        kv.Add(new KeyValuePair<string, string>("key2", "value"));


        var req = new HttpRequestMessage(System.Net.Http.HttpMethod.Post, "your url") { Content = new FormUrlEncodedContent(kv) };
        var responseAsyn = client.SendAsync(req);
        var response = responseAsyn.GetAwaiter().GetResult();

        TokenModel tokenResponse = new TokenModel();
        if (response.StatusCode == System.Net.HttpStatusCode.OK)
        {
            var responseString = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
            tokenResponse = JsonConvert.DeserializeObject<TokenModel>(responseString);
        }