仅在使用 .NET Framework 时出现 404 错误
Getting 404 error only when using .NET framework
我正在尝试在 JIRA 中为特定项目创建 version
。
我可以通过 Postman 手动构建我的请求来完成该过程,但是在通过 .NET 创建版本记录时失败并显示 404。
我假设 .NET 向 Postman 不执行的请求添加了讨厌的参数。
奇怪的是身份验证调用有效,但版本创建失败。
这是我写的助手:
public class JIRA
{
private string AuthToken { get; set; }
private const string c_JIRAUrl = "https://org.atlassian.net";
private const string c_LoginUrl = c_JIRAUrl + "/rest/auth/1/session";
private const string c_CreateVersionUrl = c_JIRAUrl + "/rest/api/2/version";
public JIRA()
{
//this works...
var authResponse = ExecuteRequest(c_LoginUrl, "POST", new
{
username = "login",
password = "password"
});
AuthToken = authResponse["session"]["value"].ToString();
}
public void CreateVersion(string name, string projectKey, ProjectEnvironment environment)
{
//lets hardcode the same data I use in Postman for testing purposes...
var createVersionResponse = ExecuteRequest(c_CreateVersionUrl, "POST", new
{
description = "An excellent version",
name = "1.1.2",
archived = false,
released = false,
project = "TEST"
});
}
private JObject ExecuteRequest(string url, string method, object data)
{
HttpWebResponse response;
var jsonDataString = JsonConvert.SerializeObject(data);
byte[] dataBytes = Encoding.Default.GetBytes(jsonDataString);
var responseText = string.Empty;
var wr = (HttpWebRequest)WebRequest.Create(url);
wr.ContentType = "application/json";
if (!string.IsNullOrEmpty(AuthToken))
wr.Headers.Add(HttpRequestHeader.Authorization, $"Bearer {AuthToken}");
wr.Method = method;
wr.ContentLength = dataBytes.Length;
wr.Accept = "application/json";
using (var webStream = wr.GetRequestStream())
{
webStream.Write(dataBytes, 0, dataBytes.Length);
response = (HttpWebResponse)wr.GetResponse();
}
using (var sr = new StreamReader(response.GetResponseStream()))
{
responseText = sr.ReadToEnd();
}
return JObject.Parse(responseText);
}
}
CreateVersion
方法总是失败并返回 404。
如我所说,同样的操作(检索令牌、创建版本)在 Postman 中都有效。
有什么想法吗?
谢谢。
显然,在检索令牌 (/rest/auth/1/session
) 时,响应包含 POSTMAN 在第二次请求(创建版本)中发回的 cookie。我必须启动 Fiddler 才能发现它正在这样做,因为它 UI 并没有这么说。
我的 .NET 客户端没有这样做。当它这样做时,它起作用了。
我对 REST 服务需要 cookie 感到有点恼火...
我正在尝试在 JIRA 中为特定项目创建 version
。
我可以通过 Postman 手动构建我的请求来完成该过程,但是在通过 .NET 创建版本记录时失败并显示 404。
我假设 .NET 向 Postman 不执行的请求添加了讨厌的参数。
奇怪的是身份验证调用有效,但版本创建失败。
这是我写的助手:
public class JIRA
{
private string AuthToken { get; set; }
private const string c_JIRAUrl = "https://org.atlassian.net";
private const string c_LoginUrl = c_JIRAUrl + "/rest/auth/1/session";
private const string c_CreateVersionUrl = c_JIRAUrl + "/rest/api/2/version";
public JIRA()
{
//this works...
var authResponse = ExecuteRequest(c_LoginUrl, "POST", new
{
username = "login",
password = "password"
});
AuthToken = authResponse["session"]["value"].ToString();
}
public void CreateVersion(string name, string projectKey, ProjectEnvironment environment)
{
//lets hardcode the same data I use in Postman for testing purposes...
var createVersionResponse = ExecuteRequest(c_CreateVersionUrl, "POST", new
{
description = "An excellent version",
name = "1.1.2",
archived = false,
released = false,
project = "TEST"
});
}
private JObject ExecuteRequest(string url, string method, object data)
{
HttpWebResponse response;
var jsonDataString = JsonConvert.SerializeObject(data);
byte[] dataBytes = Encoding.Default.GetBytes(jsonDataString);
var responseText = string.Empty;
var wr = (HttpWebRequest)WebRequest.Create(url);
wr.ContentType = "application/json";
if (!string.IsNullOrEmpty(AuthToken))
wr.Headers.Add(HttpRequestHeader.Authorization, $"Bearer {AuthToken}");
wr.Method = method;
wr.ContentLength = dataBytes.Length;
wr.Accept = "application/json";
using (var webStream = wr.GetRequestStream())
{
webStream.Write(dataBytes, 0, dataBytes.Length);
response = (HttpWebResponse)wr.GetResponse();
}
using (var sr = new StreamReader(response.GetResponseStream()))
{
responseText = sr.ReadToEnd();
}
return JObject.Parse(responseText);
}
}
CreateVersion
方法总是失败并返回 404。
如我所说,同样的操作(检索令牌、创建版本)在 Postman 中都有效。
有什么想法吗?
谢谢。
显然,在检索令牌 (/rest/auth/1/session
) 时,响应包含 POSTMAN 在第二次请求(创建版本)中发回的 cookie。我必须启动 Fiddler 才能发现它正在这样做,因为它 UI 并没有这么说。
我的 .NET 客户端没有这样做。当它这样做时,它起作用了。
我对 REST 服务需要 cookie 感到有点恼火...