0

我们内部的 Redmine 服务器只允许我通过 HTTPS 连接。以下是我尝试通过 .NET 中的 HTTPS 使用 REST API 的方法:

  1. 正如将 REST API 与 .NET 一起使用中所建议的那样,将主机变量设置为"https://redmine.company.com/redmine/",将 apiKey 设置为"ffffffffffffffffffffffffffffffffffffffff".
  2. 使用以下代码从头开始:

    using System.IO;
    using System.Net;
    
    class Program
    {
        static void Main(string[] args)
        {
            ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, error) => true;
    
            var request = (HttpWebRequest)WebRequest.Create(
                "https://redmine.company.com/redmine/issues/149.xml?key=ffffffffffffffffffffffffffffffffffffffff");
            request.CookieContainer = new CookieContainer();
            request.Method = "GET";
    
            using (var response = request.GetResponse()) // Hangs here
            using (var responseStream = response.GetResponseStream())
            using (var memoryStream = new MemoryStream())
            {
                responseStream.CopyTo(memoryStream);
            }
        }
    }
    

当然,company.com并且ffffffffffffffffffffffffffffffffffffffff只是我的真实公司的占位符和我的帐户页面上的真实 API 密钥。两次尝试都会挂起一段时间,然后出现 WebException 超时(请参阅尝试 2 中的Hangs here评论)。然后我尝试从 Redmine 服务器下载其他内容(例如 time_entries.csv、atom feed 等),每次都得到完全相同的结果。

到目前为止很糟糕。但是,如果我将 URL 复制粘贴https://redmine.company.com/redmine/issues/149.xml?key=ffffffffffffffffffffffffffffffffffffffff到浏览器中,我会得到我期望的响应。因此,似乎我们的 Redmine 服务器表现得如其所愿,但不知何故,我无法让它在 .NET 上工作。

我已经成功地从其他 HTTPS 站点下载了东西,并设法从http://demo.redmine.org下载了带有尝试 2 代码的问题数据(当然还有经过调整的 URL 等)。因此,Redmine 如何通过 HTTPS 进行通信似乎有些特别之处。

如果有人通过 .NET 的 HTTPS 成功使用 Redmine REST API,我将非常感谢一些关于我做错了什么的指示。

此外,将不胜感激有关如何从客户端进行调试的建议。到目前为止,我已经尝试过 Fiddler2,但没有成功。一旦我启用它的“解密 HTTPS 流量”设置,当我在 Internet Explorer 中发出请求时,我就不再得到答案。

4

3 回答 3

1

我们使用redmine-net-api,它支持基于 API 密钥的 HTTP/S 连接和身份验证。


        RedmineManager rm = new RedmineManager("https://<your-address>", <api-key>, "random-password");
        IList<Issue> issues = rm.GetObjectList<Issue>(new NameValueCollection() { { "project_id", <project-id> } });
于 2012-05-18T16:12:36.130 回答
0

参数的显式传递SecurityProtocolType.Tls12securityProtocolType解决了我的问题:

RedmineManager redmineManager = new RedmineManager(_host, _apiKey, 
    securityProtocolType: SecurityProtocolType.Tls12);
于 2016-08-26T11:23:47.823 回答
0

试试这个,它对我有用:

// Allow every secure connection
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, error) => true;

// Create redmine manager (where URL is "https://10.27.10.10/redmine" for me and redmineKey is my redmine API key
RedmineManager redmineManager = new RedmineManager(redmineURL, redmineKey);

// Create your query parameters
NameValueCollection queryParameters = new NameValueCollection { { "project_id", "4" }, {"tracker_id", "17"}, { "offset", "0" } };

// Perform your query
int issuesFound = 0;
foreach (var issue in redmineManager.GetObjectList<Issue>(queryParameters, out issuesFound))
{
// By default you get the 25 first issues of the project_id and tracker_id specified.
// Play with the offset to get the rest
queryParameters["offset"] = ....
}
于 2015-10-02T07:40:55.323 回答