繁体   English   中英

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

[英]How to Access File Content from C# HTTPWebRequest with AutoRedirect

我正在尝试调用应该返回身份验证令牌的 URL。 数据发布到 URL 并在多次重定向后返回 JSON object 和令牌。 我正在使用 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 响应):

            System.Windows.Forms.Application.DoEvents();

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

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

尝试使用 Newtonsoft 阅读 Newtonsoft.Json

TokenModel tokenModel;

StreamReader reader1 = new StreamReader(response1.GetResponseStream());
using (JsonTextReader reader = new JsonTextReader(reader1))
{    
 tokenModel = serializer.Deserialize<TokenModel>(reader);
}

参考: https://www.newtonsoft.com/json/help/html/ReadJson.htm

或者您可以使用以下完整请求和 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);
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM