c# - c#中的嵌套HttpWebRequest
问题描述
[HTTPWEBREQUEST 1] https://1drv.ms/u/s!AtL5uCkGy1ERgbEWHlNApMtROuP_0Q
[HTTPWEBREQUEST 2] https://1drv.ms/u/s!AtL5uCkGy1ERgbEXlHjqHdho3lUjfw
当我尝试第二次调用 withing main HttpWebRequest1 和嵌套的 HttpWebRequest2 时,它运行良好。但是在嵌套的 HttpWebRequest2 的第二次运行中,我在第二次运行时在 THIS line(System.IO.StreamReader sr2 = new System.IO.StreamReader(s2)) 上遇到异常。例外:>“消息=”流不可读。”
try
{
HttpWebRequest WebRequestObjectCards = (HttpWebRequest)HttpWebRequest.Create("https://api.ucy.ac.cy/api/v1/cards?status=Valid&");
HttpWebRequest WebRequestObjectUsers = (HttpWebRequest)HttpWebRequest.Create("https://api.ucy.ac.cy/api/v1/users/" + ucy_id);
if (WebRequestObjectCards != null && WebRequestObjectUsers != null)
{
WebRequestObjectCards.Method = "GET";
WebRequestObjectCards.Timeout = 12000;
WebRequestObjectCards.ContentType = "application/json";
WebRequestObjectCards.Headers.Add("Authorization", "Bearer XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
WebRequestObjectCards.KeepAlive = true;
WebRequestObjectUsers.Method = "GET";
WebRequestObjectUsers.Timeout = 12000;
WebRequestObjectUsers.ContentType = "application/json";
WebRequestObjectUsers.Headers.Add("Authorization", "Bearer XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
WebRequestObjectUsers.KeepAlive = true;
using (System.IO.Stream s = WebRequestObjectCards.GetResponse().GetResponseStream())
{
using (System.IO.StreamReader sr = new System.IO.StreamReader(s))
{
var jsonResponse = sr.ReadToEnd();
var serializer = new JavaScriptSerializer();
serializer.MaxJsonLength = Int32.MaxValue; // The value of this constant is 2,147,483,647
Students UCYstudents = serializer.Deserialize<Students>(jsonResponse);
//String to be added in csv
var csv = new StringBuilder();
//prepare CSV Header
newLine = string.Format("***StartOfFile***");
csv.AppendLine(newLine);
newLine = string.Format("ID; FirstName; LastName; RFIDUID; PrintedCardNumber; ValidUntil; Enabled; email; group ");
csv.AppendLine(newLine);
//deserialize JSON to CSV
foreach (var item in UCYstudents.data)
{
if (item.ucy_id != null)
{
ucy_id = item.ucy_id;// used as parameter for WebRequestObjectUsers
ID = item.ucy_id.ToString().TrimStart('0');
RFIDUID = item.card_number.ToString().TrimStart('0');
PrintedCardNumber = item.card_number.ToString().TrimStart('0');
if (item.expiration_date != null)
{
ValidUntil = item.expiration_date.ToString().Replace("-30","-01");
dt = Convert.ToDateTime(ValidUntil);
ValidUntil = ("" + dt.Day + "." + dt.Month + "." + dt.Year);
}
else
{
ValidUntil = "";
}
Enabled = "TRUE";
//Getting response from WebRequestObjectUsers
using (System.IO.Stream s2 = WebRequestObjectUsers.GetResponse().GetResponseStream())
{
using (System.IO.StreamReader sr2 = new System.IO.StreamReader(s2))
{
serializer = new JavaScriptSerializer();
serializer.MaxJsonLength = Int32.MaxValue; // The value of this constant is 2,147,483,647
jsonResponse = sr2.ReadToEnd();
Users UCYUser = serializer.Deserialize<Users>(jsonResponse);
FirstName = UCYUser.data.name_en.ToString();
LastName = UCYUser.data.surname_en.ToString();
email = UCYUser.data.mail.ToString();
group = "1";
//Write Fields to CSV File
newLine = string.Format("{0};{1};{2};{3};{4};{5};{6};{7};{8}", ID, FirstName, LastName, RFIDUID, PrintedCardNumber, ValidUntil, Enabled, email, group);
csv.AppendLine(newLine);
ID = "";
FirstName = "";
LastName = "";
RFIDUID = "";
PrintedCardNumber = "";
ValidUntil = "";
email = "";
group = "";
sr2.Close();
}
}
}
}
File.WriteAllText(@".\export.csv", csv.ToString(), Encoding.UTF8);
}
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
解决方案
您创建的两个HttpWebRequest
对象是该类的不同实例;您无需在使用另一个时关闭或重置其中一个。
如果 API 遵循约定,则401
错误的含义正是消息所说的:服务器认为第二个请求没有被授权访问该端点。也许服务器具有获取用户列表所需的不同权限。Authorization: Bearer
服务器通过您发送的令牌识别请求和权限。查看其他方法来测试该令牌并从该端点请求数据。
推荐阅读
- oauth - OAuth2:是否与访问令牌一起更新刷新令牌?
- javascript - 从实例化对象到外部范围的变量引用如何在 NodeJS 中工作
- jsf - 没有找到命名空间 http://www.w3.org/1999/xlink JSF 的库
- filter - Report Studio 过滤器中的 CASE 语句
- sql - 从 SQL Server 复制数据时,R 中缺少值的行
- svg - 当视图框为负时鼠标事件的svg问题
- java - 从 Singleton 调用 Vaadin 组件的 bean 方法
- android - 具有 API 调用和棉花糖权限的 Android 自定义系统键盘
- android - Xamarin Android APK 与 AndroidManifest.xml 中的名称不同
- html - 从表到多级树