【问题标题】:Post JSON over HTTPS通过 HTTPS 发布 JSON
【发布时间】:2013-04-19 13:23:32
【问题描述】:

过去我已经成功地通过 HTTP 调用了 JSON 网络服务 但是,现在我必须通过 HTTPS 进行 JSON POST。

我尝试使用适用于 HTTP 的代码,只是将被调用的 url 更改为 https,但它不起作用。

这是我正在使用的代码...

WebRequest wrGETURL;
wrGETURL = WebRequest.Create("https://apitest.example.com/geo/coverage/v1/?appId=2644571&appKey=836621d715b6ce4db5f007d8fa2214f");
wrGETURL.Method = "POST";
Stream objStream;
objStream = wrGETURL.GetResponse().GetResponseStream();
StreamReader objReader = new StreamReader(objStream);
string responseFromServer = objReader.ReadToEnd();

我在提琴手看到的错误信息是:

fiddler.network.https> 无法保护 apitest.example.com 的现有连接。对 SSPI 的调用失败,请参阅内部异常。 InnerException: System.ComponentModel.Win32Exception (0x80004005): 客户端和服务器无法通信,因为它们没有共同的算法

谁能帮我解决通过 HTTPS 拨打电话需要做的事情吗?

【问题讨论】:

  • 你能发布你的代码和你遇到的错误吗?
  • 取消投票。一个更好的问题!
  • +1 来自我。似乎是一个真正的问题。现在,是不是因为它期待 PUT(正如您在问题中提到的那样)并且实际上您正在传递一个 POST 方法?
  • @Ademar 道歉 - 这是一个错字。它应该是 POST 而不是 PUT
  • 在这种情况下,您是否尝试过在这里执行您的请求:stackoverflow.com/questions/9145667/…

标签: c# json web-services https


【解决方案1】:

您是否需要对服务器证书进行身份验证或回调? 在大多数情况下,这对我有用:

        var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://someurl/");
        httpWebRequest.ContentType = "application/json";
        httpWebRequest.Method = "POST";

        // Create NetworkCredential Object 
        NetworkCredential admin_auth = new NetworkCredential("username", "password");

        // Set your HTTP credentials in your request header
        httpWebRequest.Credentials = admin_auth;

        // callback for handling server certificates
        ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

        using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
        {
            string json = "{\"name\":\"TEST_123\"}";
            streamWriter.Write(json); 
            streamWriter.Flush();
            streamWriter.Close();
            var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
            using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
            {
                var result = streamReader.ReadToEnd();
                Console.WriteLine(result);
            }
       }

【讨论】:

  • 更不用说进行某种证书验证只是为了确保我们连接到我们认为的服务器是合适的。否则,该代码还将接受任何证书,从而允许 MITM 攻击:P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
  • 1970-01-01
  • 2011-01-07
相关资源
最近更新 更多